Что нам гарантирует, что запуская дальше программы для клеток

вы сможем выполнить обход (ведь мы сейчас в клетке

) ?
Мы не запускаем программу для клетки

.
На первом шаге мы запускаем программу для клетки

.
На втором шаге мы запускаем программу для той клетки, в которой мы должны быть сейчас, если начальная клетка была

.
На третьем шаге мы запускаем программу для той клетки, в которой мы должны быть сейчас, если начальная клетка была

.
В какой-то момент мы дойдем до клетки, с которой на самом деле начинали (не текущую итерацию, а вообще весь алгоритм), правильно определим, в какой клетке мы сейчас, и обойдем всё.
Обратите внимание, что в моей формализации, вторым аргументом

является

- клетка, в которой мы оказались, если настоящая начальная клетка

, а не просто

.