Это - головоломка 15 , которую я программирую с уже предоставленной нам исходной конфигурацией. Здесь я рассмотрел отверстие как число 0. Примечание: я внес изменения, приведенные в комментариях, но проблема печати еще существует дважды. Я исправил границы массива, заменил значения ASCII на соответствующие им символы и сделал функции, чтобы сделать его более компактным, но я не понимаю, почему он печатается дважды ... Еще раз спасибо за помощь.
#include <stdio.h>
#include <stdlib.h>
void print(int x[][4], int, int);
void func(int z[][4], int*, int, int*, int);
void main() {
int a[4][4] = { 1, 4, 15, 7,
8, 10, 2, 11,
14, 3, 6, 13,
12, 9, 5, 0 };
int b[4][4];
int n, temp, i, j, x_coord = 3, y_coord = 3, count = 0;
while (count != 15) {
print(a, 4, 4);
count = 0;
n = getch();
if (n == 'H') {
if (x_coord != 3)
func(a, &x_coord, 1, &y_coord, 0);
else
printf("\nWrong move!\n");
}
if (n == 'P') {
if (x_coord != 0)
func(a, &x_coord, -1, &y_coord, 0);
else
printf("\nWrong move!\n");
}
if (n == 'K') {
if (y_coord != 3)
func(a, &x_coord, 0, &y_coord, 1);
else
printf("\nWrong move!\n");
}
if (n == 'M') {
if (y_coord != 0)
func(a, &x_coord, 0, &y_coord, -1);
else
printf("\nWrong move!\n");
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
b[i][j] = a[i][j];
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (b[i][j] == 0) {
temp = b[i][j];
b[i][j] = b[3][3];
b[3][3] = temp;
}
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == 4 && j == 4)
continue;
if (b[i][j] == 4 * i + j + 1)
count++;
}
}
}
}
void print(int x[][4], int r, int c) {
int i, j;
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
printf("%d ", x[i][j]);
printf("\n\n");
}
}
void func(int z[][4], int *x, int x1, int *y, int y1) {
z[*x][*y] = z[*x + x1][*y + y1];
z[*x + x1][*y + y1] = 0;
*x = *x + x1;
*y = *y + y1;
}