2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Перебор: Обход ферзём всех полей доски
Сообщение22.12.2008, 19:06 
Аватара пользователя
Помогите, пожалуйста, с алгоритмом программы: нужно найти минимальное количество ходов, за которое ферзь может обойти все поля шахматной доски.
(имеется ввиду, что за один ход из a в b ферзь пробегает и по всем клеткам между a и b)
Само собой тут рекурсия, ибо полный перебор.
Если записывать все ходы из каждой точки - очень долго получится, должен же быть способ быстрее.


Вот тут рисунок (в самом низу).

 
 
 
 
Сообщение24.12.2008, 00:21 
а начальное положение ферзя задано?

 
 
 
 
Сообщение24.12.2008, 00:42 
Аватара пользователя
В общем неважно, но пусть будет как на картинке -- левый нижний угол.

 
 
 
 
Сообщение24.12.2008, 13:09 
Ну вот мне лично кажется что если задачка написать программку то надо так или иначе использовать перебор достаточно большого количества вариантов.
Запоминать все ходи естественно нет надобности.
Можно полагать что когда ми делаем ход по какому то направлению то нужно дойти до конца строчки. (тоесть ходи должны бить длинными).
Так как квадрат фигура симетричная то можна запоминать только половину вариантов.

На первом ходу у ты можеш пойти двумя вариантами либо по диагонали либо вправо(причом до упора). Оказываешся в следующем угле. По диагонали смысл идти врятли есть(я полагаю што самопересечений не должно бить, я думаю што ето можно допустить если сказать что за пределы доски мы не имеем права вилазить) тогда надо опять двигатса снова куда то в сторону и снова искать путь без самопересечений. и.т.д.
Тоесть надо запоминать варианти ходов и прорабативать их рекурсивно. Ветку рекурсии стоит обривать если ти не можеш двигатся без самопересечений. Потом просто сравнить все результаты. Думаю их будет не очень много.
Правда тут возникают проблемы с тем что может случится так что ти заполниш ровно половину квадрата (как на том ресунке, но решение етой проблемы там нарисовано).
З.Ы. мысли вслух.

 
 
 
 
Сообщение24.12.2008, 13:55 
Аватара пользователя
Nerazumovskiy писал(а):
можеш пойти двумя вариантами либо по диагонали либо вправо(причом до упора) ... я думаю што ето можно допустить если сказать что за пределы доски мы не имеем права вилазить) тогда надо опять двигатса снова куда то в сторону....
З.Ы. мысли вслух.


Интересно мыслите. Пишите еще. :D :D :D

З.Ы. Предлагаю новый оператор: gotoкуда-то;

 
 
 
 
Сообщение24.12.2008, 14:29 
Будете смеятсо но я так и ниразу не смог написать goto (в С) чтоб не получить похвалы от компилятора. Как результат всегда пишу без него (хороший вкус програмиривания так сказать). :)

 
 
 
 
Сообщение24.12.2008, 14:54 
Аватара пользователя
Nerazumovskiy писал(а):
Будете смеятсо


Не буду. Больше не могу. :cry:

 
 
 
 
Сообщение25.12.2008, 19:30 
Аватара пользователя
Nicholas
Полный перебор это куча вариантов. 8^64.
Лучше возьмем жадный алгоритм будем делать наимболее большии ходы не в плане длины а в плане пройденных еще не помеченных клеток..
Допустим ферзь стоит в начале координат тогда заполним по спирали.
получим 14 ходов.
Если ферзь стоит не в начале координат, а где либы. то тут тоже идем к стенки и заполняем по спирали делая наибольшии ходы перебирая по часовой стрелке. опять 14. Это будет наименьшее число ходов остается даказать это. Мы можем сделать только один ход по 8 клеток 2 хода по 7 клеток 2 по 6 и тд. до 3 по три и два по три.
8+7*2+6*2+5*2+4*2+3*2+2*3=64 клетки

 
 
 
 
Сообщение25.12.2008, 19:41 
Аватара пользователя
По спирали 15 получается.

 
 
 
 
Сообщение27.12.2008, 22:23 
если хочеш написать таки програму то можеш писать перебором(с учотом всех приведущих, идей которие тебе понравятся :) ) но теперь ти знаеш что у тебя потолок ето 15 ходов а значит перебор будет не таким уже и большим 2^{45} ходов(и ето если делать в лоб,
а можна и меньше(если учесть преведущие мысли)

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group