E145. Игра Пятнашки: существование решения

e-maxx algorithm original: C/C++ #algorithm #emaxx #misc
Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

Источник: e-maxx.ru/algo, страница PDF 478.

Напомним, что игра представляет собой поле

на

, на котором расположены

фишек, пронумерованных числами от

до

, а одно поле оставлено пустым. it is required, передвигая на каждом шаге какую-либо фишку на свободную позицию, прийти в конце концов к следующей позиции: Игру Пятнашки ("15 puzzle") изобрёл в 1880 г. Нойес Чэпман (Noyes Chapman).

Существование решения

Здесь мы рассмотрим такую задачу: по данной позиции на доске сказать, существует ли последовательность ходов, приводящая к решению, или нет. Пусть дана некоторая позиция на доске:

где один из elementов равен нулю и обозначает пустую клетку

. Рассмотрим перестановку: (т.е. перестановка чисел, соответствующая позиции на доске, без нулевого elementа)

Обозначим через

количество инверсий в этой перестановке (т.е. количество таких elementов

и

, что

,

но

).

Далее, пусть

— номер строки, в которой находится пустой element (т.е. в наших

обозначениях

.

Тогда, Lời giải существует тогда и только тогда, когда

чётно.

Cài đặt

Проиллюстрируем указанный выше Thuật toán с помощью программного кода:

int a[16];
for (int i=0; i<16; ++i)

cin >> a[i];

int inv = 0;
for (int i=0; i<16; ++i)
if (a[i])
for (int j=0; j<i; ++j)
if (a[j] > a[i])

++inv;

for (int i=0; i<16; ++i)
if (a[i] == 0)

inv += 1 + i / 4;

puts ((inv & 1) ? "No Solution" : "Solution Exists");

Chứng minh

Джонсон (Johnson) в 1879 г. доказал, что если

нечётно, то решения не существует, а Стори (Story) в том же

году доказал, что все позиции, для которых

чётно, имеют Lời giải. Однако оба эти доказательства были достаточно сложны. В 1999 г. Арчер (Archer) предложил значительно более простое Chứng minh (скачать его статью можно здесь).

C# lời giải

bản nháp tự động, xem lại trước khi gửi
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    int a[16];
    for (int i=0; i<16; ++i)
            cin >> a[i];
    int inv = 0;
    for (int i=0; i<16; ++i)
            if (a[i])
                    for (int j=0; j<i; ++j)
                            if (a[j] > a[i])
                                    ++inv;
    for (int i=0; i<16; ++i)
            if (a[i] == 0)
                    inv += 1 + i / 4;
    puts ((inv & 1) ? "No Solution" : "Solution Exists");
}

C++ lời giải

đã khớp/gốc
int a[16];
for (int i=0; i<16; ++i)
        cin >> a[i];
int inv = 0;
for (int i=0; i<16; ++i)
        if (a[i])
                for (int j=0; j<i; ++j)
                        if (a[j] > a[i])
                                ++inv;
for (int i=0; i<16; ++i)
        if (a[i] == 0)
                inv += 1 + i / 4;
puts ((inv & 1) ? "No Solution" : "Solution Exists");

Java lời giải

bản nháp tự động, xem lại trước khi gửi
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    int a[16];
    for (int i=0; i<16; ++i)
            cin >> a[i];
    int inv = 0;
    for (int i=0; i<16; ++i)
            if (a[i])
                    for (int j=0; j<i; ++j)
                            if (a[j] > a[i])
                                    ++inv;
    for (int i=0; i<16; ++i)
            if (a[i] == 0)
                    inv += 1 + i / 4;
    puts ((inv & 1) ? "No Solution" : "Solution Exists");
}

Материал разбит как Thuật toánическая Bài toán: изучить постановку, понять асимптотику и реализовать Thuật toán на выбранном языке.

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.