在15个难题中0不会移动 香港专业教育学院试图四处移动,删除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”是空格