|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrew Ezhguroff 2:5020/400 18 Feb 2002 16:48:59 To : Yasha Davidov Subject : Re: 8 ферзей -------------------------------------------------------------------------------- Привет! "Yasha Davidov" <yasha@davidov.ru> сообщил(а): YD> Всё равно нужен массив с кучей бесполезной информации. Этого то я и YD> хотел избежать. YD> К тому же нужна какая-то предварительная обработка. YD> Пока я сделал так: YD> Я перебираю значения в таком порядке: YD> [01234567] YD> [01234576] YD> [01234657] YD> [01234675] Возможно, это способ ускорить поиск расстановок: Если в ферзь стоит на строке N в позиции M, то на строке N+q ферзь не может находиться в позициях M-q, M, M+q. Проще всего это реализовать с помощью битовых строк: Заводим три переменные - L, R и H. Установка ферзя в столбец Pos: L|=(1<<Pos); R|=(1<<Pos); H|=(1<<Pos) Проверка на допустимость установки ферзя в столбец Pos текущей строки: !((L|R|H)&(1<<Pos)) Hевозможность поставить ферзя в текущую строку: (L|R|H)==0xFF Переход к следующей строке: L<<=1; R>>=1 YD> Всё это очень похоже на простой перебор чисел. Поэтому я делаю так, YD> когда я нахожу перестановку, являющуюся решением я беру все её 8 YD> отражений, и если хоть одно из этих отражений меньше, (то есть было YD> раньше) чем текущая доска (я могу легко это определит), то значит этот YD> тип доски я уже находил раньше. В противном случае это решение. Плюс я YD> перебираю только от [01234567] до [476543210], то есть только YD> половину. YD> Hо я думаю, что есть способ ещё проще... Очевидное решение - отсортировать массив расстановок (тем более, что у тебя он уже отсортирован) и определять дубли бинарным поиском (не исключая их из массива - это слишком медленно, а ставя флажок). Что сокращает кол-во операций с O(N^3) до O(N^2*log(N)) (оценка неточная, думать лень :-) ). К тому же можно представить расстановки в виде Int64 (та же битовая строка длинной 64 бита) и работать не с массивами, а с целыми числами. С уважением, Андрей. -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/6488ce375550.html, оценка из 5, голосов 10
|