▼Прихований текст
Пам'ятаю, щось схоже я робив, коли тре було написати прогу для вирішення транспортної задачі. Я її так і не написав, але не тому що був дурний, а тому що не знав по якому правилу шукати значення, і шукав його по такому правилу, де тре було робити багато розгалужень, і мені було ліньки...
Ну дивіться, починаємо з центру, ага?
http://не-дійсний-домен/cujoj/9bc6b0ff07.png
Для нас головне в визначенні індексу наступної дірки це що? Вірно, напрямок!
Починаємо з напрямку вниз. Але перш ніж рухатись вниз, ми маємо перевірити, чи така дірка взагалі існує, адже ми можемо впертись в дно.
Тому перш ніж переходити на слідуючу дірку - треба перевірити, чи вона взагалі існує, і якщо не існує, то треба змінити напрямок.
А як змінити напрямок? Та дуже просто. У нас же є чітка послідовність: вниз -> вліво -> вверх -> вправо ну і знову вниз.
Гадаю, алгоритм вже зрозумілий, ага?
1) Робимо спробу двинутись в сторону (починаємо з руху вниз), перед цим перевіряємо, чи знизу є дірка.
2) Якщо дірка є - то все окей, переходимо на неї, та переходимо до пункту 1.
3) Якщо дірки немає, то залишаємось на поточному місці, змінюємо напрямок та переходимо до пункту 1.
Так, як кількість елементів матриці == кількості елементів вектору, то умовою зупинки буде рівність лічильника нулю, ну або 81, в залежності від його початкового значення та вибору між декрементом та інкрементом.
Ну а як змінювати індекси?
Ну от в моєму прикладі початок буде в точці arr[1,1] де перший індекс - номер стрічки, а другий - номер колонки (або навпаки).
Операція "вниз" означає, що номер стрічки має зменшитись на 1, тобто буде arr[0,1], ну а "вверх" - збільшення номеру стрічки, така сама срака з операціями "вліво" та "вправо", тільки там змінюємо номер стовбчика.
p.s. можу щось наплутати, бо я нє в сєбе від недосипу.
p.s.s. ах да, я зовсім не взяв до уваги умову повороту, хдд