15个难题,零不会动

时间:2019-04-16 04:35:20

标签: c linux puzzle

在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”是空格

0 个答案:

没有答案