Кто нить реализовывал?
Проблема в том, чтобы по случайной их перестановке сразу же сказать можно ли такие пятнашки расставить обратно или нет. Нарыл в инете что нужно смотреть на четность числа инверсий, но что то я так и не понял что за инверсии. Мож кто подскажет?
Элементарно - берешь исходную позицию и переставляешь - стопудово можно будет обратно переставить ;)
А тебе что - надо разбросать их чтобы потом можно было "решить"?
Их всегда можно расставить обратно ;) ...если только ты их вообще не по-рандому разбрасываеш на поле.
Представь, что у тебя есть пятнашки, дырка и они фиксированы(так что ты можеш двигать только ближайшие к дырке пятнашки на место этой самой дырки)
и распаложены в стартовой позиции:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 0 (0 - дырка)
Чтобы их разбросать - делаеш некий цикл, который будет решать - какую из ближайших(к дырке) пятнашек двигать на дырку и двигать ли вообще :)
усё
Да ё-мае :)
У нас препод такой, что он потребовал сделать так, чтобы расстановку пятнашек можно сделать вручную, т.е. не от дырки - получается рандомно. Если бы я сам раскидывал их понятно дело такой проблемы бы не встало. )
ищи тут: http://systemhalt.nm.ru/
Уже обсуждалось.
Если перестановка получена из перестановки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x
то она собирается. Если перестановка получена из перестановки
1 2 3 4 5 6 7 8 9 10 11 12 13 15 14 x
то она не собирается.
kronos_vano
Число инверсий ето количество таких чисел что их индексы i<j но a>[j]
вот у Coriolan в первом случае 0 инверсий, во 2ом 1. Т.е. можно просто считать количетво инверсий, если четно то намана все если не то плохо.
Щас не буду полный код давать, ну в общем алгоритм действий такой:
Заданы переменные: 1 - текущий номер, 15 - позиции.
По циклу прибавляеться текущий номер и генерируеться место, которое записываеться в соответствующую переменную. Перед этим нужно проверить, не равна ли этому числу другая позиция. Если нет, то записать, если да, то заного. В общем доработать это и все в порядке!
У меня получилось так:
function CheckField:boolean; var d,i,j:integer; begin d:=0; // Определяем число инверсий for i:=1 to 15 do if field[i]<>0 then begin j:=i; while j<=field[i] do begin inc(j); if ( field[i]>field[j])and( field[j]<>0) then inc( d); end; end; result:=( ( d mod 2)=0); end;
Осталась теперь проблема как заставить компьютер переводить пятнашки в исходное состояние :)
kronos_vano
>Осталась теперь проблема как заставить компьютер переводить пятнашки в исходное состояние :)
Что ты имеешь ввиду под словами "в исходное состояние"?
Если чтобы все встали по порядку, то просто создаешь функцию, присвояющую всем переменным - позициям соответствующие позиции, первой - первую, второй - вторую и.т.д.
Если чтобы выстроились как после генерации мест, то создай еще столькоже переменных и после генерации присваивай их равными соответственно.
Если менять местами по 2 фишки чётное число раз - то позиция собираема, а место без фишки не учитывай. т.е. если в процедуру перестановки попадает место без фишки, то она не отрабатывает
На правах UP-а.
Так и не смог реализовать функцию проверяющую возможность расставить пятнашки в нормальный вид. Мож кто поделиться? Выше описанная мною не работает...
Инверсии инверсии... как только я эти инверсии не считал - не работает и все (. Не понимаю как их считать (
kronos_vano
та блин, ссылку же уже приводил: http://systemhalt.nm.ru/other.html (с сорцами на бейсике и на делфи)
NightmareZ
Если чесна я там не нашел того что нада ща еще раз гляну...
kronos_vano
Возьми исходную складываемую конфигурацию и просто 100-200 раз переставь случайную фишку (с одной из 4-х сторон от пустой клетки) на пустое место. Так ты точно будешь знать, что ЭТО можно сложить. И не надо ничего проверять.
Тема в архиве.