0 не движется в 15 задачах
Я пытался передвигаться, удаляя memcpy и добавляя еще один цикл для ручного ввода значений, но он все равно не работал.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cal(int temp[4][4],int t[4][4]){
int x,y,c=0;
for(x=0;x<4;x++)
for(y=0;y<4;y++){
if(temp[x][y]!=t[x][y])
c++;
}
return c;
}
int check(int a[4][4],int b[4][4]){
int x,y,f=1;
for(x=0;x<4;x++)
for(y=0;y<4;y++)
if(a[x][y]!=b[x][y])
f=0;
return f;
}
int main(int argc,char **argv){
int a[4][4], b[4][4], c[4][4], temp[4][4];
int trackr=1,i,j,k,t,p,m=0,x=0,y=0,d=1000,dmin=0,o=0,n=4,l=0;
for(i=0;i < 4;i++){
for(j=0;j < 4;j++){
a[i][j]=atoi(argv[trackr]);
if(trackr != 16){
trackr++;
}
}
}
for(i=0;i < 4;i++){
for(j=0;j < 4;j++){
printf("%d\t",a[i][j]);
}
printf("\n");
}
memcpy(b,a,sizeof(a));
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
for(p=0;p<4;p++){
if(b[i][j]<b[k][p]){
t=b[i][j];
b[i][j]=b[k][p];
b[k][p]=t;
}
}
}
}
}
while(!(check(a,b))){
l++;
d=1000;
for(i=0;i < n;i++)
for(j=0;j < n;j++)
{
if(a[i][j]==0)
{
printf("%d,%d",i,j);
x=i;
y=j;
}
}
//To move upwards
for(i=0;i < n;i++)
for(j=0;j < n;j++)
temp[i][j]=a[i][j];
if(x!=0)
{
p=temp[x][y];
temp[x][y]=temp[x-1][y];
temp[x-1][y]=p;
}
m=cal(temp,b);
dmin=l+m;
if(dmin < d)
{
d=dmin;
for(i=0;i < n;i++)
for(j=0;j < n;j++)
c[i][j]=temp[i][j];
}
//To move downwards
for(i=0;i < n;i++)
for(j=0;j < n;j++)
temp[i][j]=a[i][j];
if(x!=n-1)
{
p=temp[x][y];
temp[x][y]=temp[x+1][y];
temp[x+1][y]=p;
}
m=cal(temp,b);
dmin=l+m;
if(dmin < d)
{
d=dmin;
for(i=0;i < n;i++)
for(j=0;j < n;j++)
c[i][j]=temp[i][j];
}
//To move right side
for(i=0;i < n;i++)
for(j=0;j < n;j++)
temp[i][j]=a[i][j];
if(y!=n-1)
{
p=temp[x][y];
temp[x][y]=temp[x][y+1];
temp[x][y+1]=p;
}
m=cal(temp,b);
dmin=l+m;
if(dmin < d)
{
d=dmin;
for(i=0;i < n;i++)
for(j=0;j < n;j++)
c[i][j]=temp[i][j];
}
//To move left
for(i=0;i < n;i++)
for(j=0;j < n;j++)
temp[i][j]=a[i][j];
if(y!=0)
{
p=temp[x][y];
temp[x][y]=temp[x][y-1];
temp[x][y-1]=p;
}
m=cal(temp,b);
dmin=l+m;
if(dmin < d)
{
d=dmin;
for(i=0;i < n;i++)
for(j=0;j < n;j++)
c[i][j]=temp[i][j];
}
printf("\nCalculated Intermediate Matrix Value :\n");
for(i=0;i < n;i++)
{
for(j=0;j < n;j++)
printf("%d\t",c[i][j]);
printf("\n");
}
for(i=0;i < n;i++)
for(j=0;j < n;j++)
{
a[i][j]=c[i][j];
temp[i][j]=0;
}
printf("Minimum cost : %d\n",d);
}
return 0;
}
0 должен двигаться, но он не вращается и находится в бесконечном цикле.
Я запустил его с
./myfile 2 3 0 4 1 6 7 8 5 9 10 12 13 14 11 15
Если я запускаю этот набор чисел, он не работает Однако, если я побежал
./myfile 1 2 3 4 5 0 6 7 8 9 10 11 12 13 14 15
работает
Должен выдать
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
но вместо этого он застрял на бесконечной петле, дающей
0 2 3 4
1 5 6 7
8 9 10 11
12 13 14 15
«0» - это пробел