15 головоломка, ноль не двигается - PullRequest
1 голос
/ 16 апреля 2019

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» - это пробел

...