Это - головоломка 15 , которую я программирую с уже предоставленной нам исходной конфигурацией. Здесь я рассмотрел отверстие как число 0.
Я не понимаю, почему массив печатается дважды после нажатия клавиш со стрелками. Сначала я печатаю массив, затем делаю его в соответствии с go необходимыми изменениями в зависимости от введенной клавиши со стрелкой, и, наконец, если полученный массив не выполняется в порядке возрастания, я повторяю шаги. Но согласно этому, это должно было быть напечатано только один раз. Так в чем же проблема?
#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;
}