这个程序写的不好,在步骤大于6后会出现溢出导致结果的错误,但最近自己也懒得去调试,先把它贴出来聊表己趣。
#include<stdio.h>
#include<malloc.h>
#define X 3
#define Y 3
//结构体申明
// // //
// // //
typedef struct object
{
int pic[Y][X],Nu_x,Nu_y, up,dowm,right,left;
struct object *prior,*pup,*pdowm,*pright,*pleft;
}object;
typedef struct addresslist
{
object *list;
struct addresslist *add;
}addresslist;
// // // // // //
int judge(object *pp);
void check(object *pp);
int check_t(object *pp,addresslist *bus);
void show(addresslist *car);
void main()
{
int i,j,key;
object obj_start,*obj;
addresslist add_start,*add_bus,*add_whip,*add_car,*add_start_two;
obj=&obj_start; //initializing the pointer obj
printf("please input your number in order/n");
for(j=0;j<Y;j++)
for(i=0;i<X;i++)
{
scanf("%d",&obj_start.pic[j][i]);
if(obj_start.pic[j][i]==0)
{
obj->Nu_x=i;obj->Nu_y=j;
}
}
check(obj);
obj_start.prior=NULL;
obj_start.pup=NULL;
obj_start.pdowm=NULL;
obj_start.pleft=NULL;
obj_start.pright=NULL;
add_start.list=obj;
add_bus=&add_start;add_car=add_bus;
add_start_two=&add_start;
add_start_two->add=NULL;
key=0;
while(1)
{
if(key>362881)
{
printf("error:there is something wrong with our system/n");
break;
};
if(judge(add_car->list)==1)break; //judeg as the factor of stopping while function
// for up
if(add_car->list->up==0)
{
add_car->list->pup=NULL;
}
else
{
add_car->list->pup=(object*)malloc(sizeof(object));
for(j=0;j<Y;j++)
{
for(i=0;i<X;i++)
{
add_car->list->pup->pic[j][i]=add_car->list->pic[j][i];
}
}
add_car->list->pup->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pup->pic[add_car->list->Nu_y-1][add_car->list->Nu_x];
add_car->list->pup->pic[add_car->list->Nu_y-1][add_car->list->Nu_x]=0;
if(check_t(add_car->list->pup,add_start_two)==0)
{
free(add_car->list->pup);
add_car->list->pup=NULL;
}
else
{
add_car->list->pup->Nu_x=add_car->list->Nu_x;
add_car->list->pup->Nu_y=add_car->list->Nu_y-1;
add_car->list->pup->prior=add_car->list;
check(add_car->list->pup);
add_car->list->pup->pup=NULL;
add_car->list->pup->pdowm=NULL;
add_car->list->pup->pright=NULL;
add_car->list->pup->pleft=NULL; //these words ensure our system go in order
add_whip=(addresslist*)malloc(sizeof(addresslist));
add_whip->list=add_car->list->pup;
add_whip->add=NULL;
add_bus->add=add_whip;
add_bus=add_whip;
key++;
}
}
//for dowm
if(add_car->list->dowm==0)
{
add_car->list->pdowm=NULL;
}
else
{
add_car->list->pdowm=(object*)malloc(sizeof(object));
for(j=0;j<Y;j++)
{
for(i=0;i<X;i++)
{
add_car->list->pdowm->pic[j][i]=add_car->list->pic[j][i];
}
}
add_car->list->pdowm->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pdowm->pic[add_car->list->Nu_y+1][add_car->list->Nu_x];
add_car->list->pdowm->pic[add_car->list->Nu_y+1][add_car->list->Nu_x]=0;
if(check_t(add_car->list->pdowm,add_start_two)==0)
{
free(add_car->list->pdowm);
add_car->list->pdowm=NULL;
}
else
{
add_car->list->pdowm->Nu_x=add_car->list->Nu_x;
add_car->list->pdowm->Nu_y=add_car->list->Nu_y+1;
add_car->list->pdowm->prior=add_car->list;
check(add_car->list->pdowm);
add_car->list->pdowm->pup=NULL;
add_car->list->pdowm->pdowm=NULL;
add_car->list->pdowm->pright=NULL;
add_car->list->pdowm->pleft=NULL;
add_whip=(addresslist*)malloc(sizeof(addresslist));
add_whip->list=add_car->list->pdowm;
add_whip->add=NULL;
add_bus->add=add_whip;
add_bus=add_whip;
key++;
}
}
//for right
if(add_car->list->right==0)
{
add_car->list->pright=NULL;
}
else
{
add_car->list->pright=(object*)malloc(sizeof(object));
for(j=0;j<Y;j++)
{
for(i=0;i<X;i++)
{
add_car->list->pright->pic[j][i]=add_car->list->pic[j][i];
}
}
add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x+1];
add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x+1]=0;
if(check_t(add_car->list->pright,add_start_two)==0)
{
free(add_car->list->pright);
add_car->list->pright=NULL;
}
else
{
add_car->list->pright->Nu_x=add_car->list->Nu_x+1;
add_car->list->pright->Nu_y=add_car->list->Nu_y;
add_car->list->pright->prior=add_car->list;
check(add_car->list->pright);
add_car->list->pright->pup=NULL;
add_car->list->pright->pdowm=NULL;
add_car->list->pright->pright=NULL;
add_car->list->pright->pleft=NULL;
add_whip=(addresslist*)malloc(sizeof(addresslist));
add_whip->list=add_car->list->pright;
add_whip->add=NULL;
add_bus->add=add_whip;
add_bus=add_whip;
key++;
}
}
//for left
if(add_car->list->left==0)
{
add_car->list->pleft=NULL;
}
else
{
add_car->list->pleft=(object*)malloc(sizeof(object));
for(j=0;j<Y;j++)
{
for(i=0;i<X;i++)
{
add_car->list->pleft->pic[j][i]=add_car->list->pic[j][i];
}
}
add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x-1];
add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x-1]=0;
if(check_t(add_car->list->pleft,add_start_two)==0)
{
free(add_car->list->pleft);
add_car->list->pleft=NULL;
}
else
{
add_car->list->pleft->Nu_x=add_car->list->Nu_x-1;
add_car->list->pleft->Nu_y=add_car->list->Nu_y;
add_car->list->pleft->prior=add_car->list;
check(add_car->list->pleft);
add_car->list->pleft->pup=NULL;
add_car->list->pleft->pdowm=NULL;
add_car->list->pleft->pright=NULL;
add_car->list->pleft->pleft=NULL;
add_whip=(addresslist*)malloc(sizeof(addresslist));
add_whip->list=add_car->list->pleft;
add_whip->add=NULL;
add_bus->add=add_whip;
add_bus=add_whip;add_bus=add_whip;
key++;
}
}
add_car=add_car->add;
}
show(add_car);
}
int judge(object *pp)
{
int i,j;
for(j=0;j<Y-1;j++)
for(i=0;i<X;i++)
{
if(pp->pic[j][i]!=i+1+j*Y)
{
return(0);
}
}
i=0; //当输入全正确时的情况完成
while(i<X-1)
{
if(pp->pic[Y-1][i]!=i+1+(Y-1)*X)return(0);
i++;
}
return(1);
}
void check(object *pp)
{
if(pp->Nu_x==0){pp->left=0;}
else {pp->left=1;}
if(pp->Nu_x==X-1){pp->right=0;}
else {pp->right=1;}
if(pp->Nu_y==0){pp->up=0;}
else {pp->up=1;}
if(pp->Nu_y==Y-1){pp->dowm=0;}
else {pp->dowm=1;}
}
int check_t(object *pp,addresslist *start) //this function throw out the same pic which we has get by a circle,
{ //and the success of check_t decites the success of key
addresslist *obj=start;
int i,j,dot;
for(dot=0;;obj=obj->add)
{
for(j=0;j<Y;j++)
{
for(i=0;i<X;i++)
{
if(pp->pic[j][i]!=obj->list->pic[j][i])
dot=1;
}
}
if(dot==0)
return(0); //"return(0)" denotes this pic has exited.
if(obj->add==NULL)return(1); //the judeg which is used to go out of the biggest f-circle must be located
} //in it,for we have to jugde the first pic.
}
void show(addresslist *car)
{
char book[362881],booktrue[362881];
int i,j;
object *zys,*zye;
zys=car->list->prior;
zye=car->list;
for(i=0;i<362881;i++)
{
book[i]=0;booktrue[i]=0;
}
for(i=0;;zys=zys->prior,zye=zye->prior,i++)
{
if(zys->Nu_x==zye->Nu_x&&zys->Nu_y==zye->Nu_y+1)
{
book[i]='u';
};
if(zys->Nu_x==zye->Nu_x&&zys->Nu_y==zye->Nu_y-1)
{
book[i]='d';
}
if(zys->Nu_x==zye->Nu_x-1&&zys->Nu_y==zye->Nu_y)
{
book[i]='r';
}
if(zys->Nu_x==zye->Nu_x+1&&zys->Nu_y==zye->Nu_y)
{
book[i]='l';
}
if(zys->prior==NULL)break;
}
for(i=362880,j=0;i>=0;i--)
{
if(book[i]==0)
continue;
else
{
booktrue[j]=book[i];
j++;
}
}
for(i=0;booktrue[i]!=0;i++)
{
if(booktrue[i]=='u')
{
printf("↑/n");
continue;
};
if(booktrue[i]=='d')
{
printf("↓/n");
continue;
};
if(booktrue[i]=='r')
{
printf("→/n");
continue;
};
if(booktrue[i]=='l')
{
printf("←/n");
continue;
};
}
getchar();
}