если еще актуально, я так делал:
- заполняешь матрицу маркерным значением, которого в результате не будет
- четыре вектора направления (0,1), (1,0), (0,-1), (-1,0)
- топаешь по матрице, слагая вектор направления с позицией и кладешь нужное значение по счетчику
- повороты выполняются по проверке след. ячейки - если она за пределами или в ней маркер, берем след. вектор