ОБНОВЛЕННЫЙ ОТВЕТ:
Прежде чем я представлю этот алгоритм, мне нужно определить два термина: инверсия и полярность.
Инверсия: пара объектов, которые находятся в обратном порядке от того, где они должны быть. Для получения дополнительной информации об инверсии см. Подсчет инверсий в массиве
Полярность головоломки состоит в том, является ли общее число инверсий среди всех плиток четным или нечетным. Головоломка с 10 инверсиями имеет четную полярность; головоломка с 7 инверсиями имеет странную полярность.
Считайте головоломку 3х3 такой:
| 6 | 3 | 2 |
| .. | 4 | 7 |
| 5 | 1 | 0 |
Подсчитав здесь все инверсии, мы получим: (i) 6 инвертировано с 0, 1, 2, 3, 4 и 5. (ii) 3 инвертировано с 0, 1 и 2. (iii) 2 инвертировано с 0 и 1. (iv) 4 инвертируется с 0 и 1. (v) 7 инвертируется с 0, 1 и 5. (vi) 5 инвертируется с 0 и 1. (vii) 1 инвертируется с 0. В Всего у нас 19 инверсий.
Если ширина головоломки равна четному числу, то перемещение плитки вверх или вниз изменит полярность, поэтому важно, чтобы головоломка имела равномерную полярность, когда пустая плитка находится в последнем ряду. Для этого мы добавим расстояние пустой плитки от нижнего ряда к нашим общим инверсиям.
Теперь мы знаем, что головоломка разрешима, если она имеет даже полярность (или перестановки). Поэтому, если наша полярность четна, тогда наша проблема решена, но для нечетной полярности мы должны сделать это:
Если пустого тайла нет в первом ряду, то поменяйте местами первые два соседних тайла в первом ряду. Это изменит полярность на 1, и у нас будет решаемая головоломка, имеющая даже полярность.
Но если пустая плитка находится в первом ряду, то поменяйте местами соседние плитки в последнем ряду. Это сделало бы головоломку разрешимой. Так что в конце вы всегда решаете головоломку.
Надеюсь, я удовлетворяю отвечающим требованиям stackoverflow для этого вопроса. Любые сомнения приветствуются. Спасибо.