Работа №4
Вариант 1: Проверка возможности хода в игре "пятнашки"
Рабочее поле пятнашек представляет собой поле размером 4х4. В каждой клетке поля, кроме одной, находится какая-либо фишка. В процессе выполнения ходов игрок имеет право, не вынимая фишку из коробки, передвинуть её с текущего места на свободное.
В рамках работы необходимо написать программу, которая считает из одного файла одну комбинацию фишек на игровом поле, из другого файла – другую комбинацию фишек на игровом поле, после чего скажет (напишет на экране), можно ли за один ход попасть из комбинации из файла 1 в комбинацию из файла 2.
Имена файлов с комбинациями необходимо прочитать из командной строки. Номера фишек можно задать просто цифрами. Как задать пустую фишку – решайте сами (в примере она задана как 00, но делать так вовсе не обязательно).
Если аргументов в строке хватать не будет – необходимо вывести пользователю сообщение с детальным описанием того, как необходимо запускать программу и какие параметры ей требуются.
Пример 1:
file1.txt:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 00
File2.txt:
01 02 03 04
05 06 07 08
09 10 11 00
13 14 15 12
Ответ – ход возможен.
Пример 2:
file1.txt:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 00
File2.txt:
01 02 03 04
05 06 07 00
09 10 11 08
13 14 15 12
Ответ – ход невозможен.
Вариант 2: Проверка возможности проведения линии
Дано рабочее поле некоторого размера (определите константами), соответствующее кусочку экрана монитора. Элементы поля соответствуют пикселям на экране. Каждый пиксель может или присутствовать, или отсутствовать.
Пример пустого поля размером 7х7:

Пример поля размером 7х7, на котором стоят какие-то точки:

Поле в программе можно представить как массив соответствующего размера. Если "пиксель" пустой, то соответствующий ему элемент массива имеет значение, например, 0. Если пиксель закрашенный – соответствующий ему элемент массива может иметь значение, например, 1. Для второго поля соответствующий массив будет выглядеть следующим образом:
int field[7][7] = {
{0,0,0,0,0,0,0}
{0,0,1,1,1,0,0}
{0,0,0,0,0,0,0}
{0,0,0,0,0,0,0}
{0,0,0,0,1,0,0}
{0,0,0,0,1,0,0}
{0,0,0,0,1,0,0}
};
В работе необходимо определить, можно ли в этом поле провести прямую линию из одной точки в другую, рисуя её по пикселям, не попав при этом ни в одну из уже имеющихся точек.
Для того чтобы узнать, какие из точек необходимо "закрашивать", следует использовать алгоритм Брезенхема (почитайте о нём в Интернете).
Физически закрашивать пиксели на вашем экране не нужно, ничего кроме работы с массивом данная работа не предполагает. Исходное поле для рисования необходимо считать из файла, имя которого указано в аргументах командной строки (если нет аргумента или файла - вывести соответствующее сообщение).
Считанное поле необходимо вывести на экран в виде значений массива, так чтобы было видно где в массиве 0, а где что-то другое. Далее требуется спросить у пользователя координаты начала и конца линии в виде индексов элементов массива, с помощью алгоритма Брезенхема посчитать координаты пикселей, которые необходимо закрасить для построения линии из первой точки во второй и вывести полученный результат так чтобы пользователь или увидел построенную линию в массиве (заново выведите массив с отмеченным точками прямой), или понял, что построение линии, которая не проходила бы через имеющиеся – невозможно (можно вывести часть линии, можно вывести координаты новой линии, можно вывести всю линию, но как-то отметить те "пиксели", которые мешали проведению этой линии, то есть тут фантазируйте, главное чтобы пользователь понял где именно проблема).
Время на выполнение – 2 недели