经过几天努力和他人的帮助,根据上面的程序进行了修改,以下为程序:
#include <stdio.h>
#include <math.h>
#include <conio.h>
struct bsm/*结构体类型定义*/
{
int s[9];
int prep,pos;/*pos变量指0在数组中所处的位置,prep变量指向产生自身的父结点*/
};
int h1,r1,h2,r2,step; /*定义全局变量*/
struct bsm p,ar1[1350],ar2[1350];/*ar1[1000]用于存放输入的矩阵,ar2[1000]用于存放目标矩阵*/
/*test()函数用来判断并输出所输入矩阵中每一个值得前面比它大的数的个数
的加和为偶数还是奇数*/
int test()
{int i,j,sum,addsum=0;
for(i=1;i<9;i++)
{sum=0;
for(j=0;j<i;j++)
{if(ar1[0].s[j]==0) continue;
if(ar1[0].s[j]<ar1[0].s[i]) sum=sum+1;}
addsum=addsum+sum;
}
printf("addsum=%d",addsum);
getch();
if(addsum%2==0)
{printf("\nThe end number:1 2 3 4 5 6 7 8 0");
getch();return 1;}
else
{printf("\nThe end number:1 2 3 8 0 4 7 6 5");
getch();return 0;}
}
/*pd()函数和pd0()函数是用作移动0的函数*/
int pd(int k)
{
int i=0,j,b1,b2;
b1=1;
p.s[p.pos+k]=p.s[p.pos]+p.s[p.pos+k];
p.s[p.pos]=p.s[p.pos+k]-p.s[p.pos];
p.s[p.pos+k]=p.s[p.pos+k]-p.s[p.pos];
p.pos=p.pos+k;
for (i=0;i<=r1;i++)
{
b2=0;
for (j=0;j<9;j++)
if (!(ar1[i].s[j]==p.s[j])) b2=1;
b1=b1*b2;
}
return(b1);
}
int pd0(int k)
{
int i,j,b1,b2;
b1=1;
p.s[p.pos+k]=p.s[p.pos]+p.s[p.pos+k];
p.s[p.pos]=p.s[p.pos+k]-p.s[p.pos];
p.s[p.pos+k]=p.s[p.pos+k]-p.s[p.pos];
p.pos=p.pos+k;
for (i=0;i<=r2;i++)
{
b2=0;
for (j=0;j<9;j++)
if (!(ar2[i].s[j]==p.s[j])) b2=1;
b1=b1*b2;
}
return(b1);
}
/*pd1()函数和pd2()函数是用来寻找相交结点的函数*/
int pd1()
{
int i,j,b1,b2;
b1=0;
for (i=h2;i<=r2;i++)
{
b2=0;
for (j=0;j<9;j++)
if (!(ar2[i].s[j]==p.s[j])) b2=1;
if (0==b2)
{
r2=i;
b1=1;
}
}
return(b1);
}
int pd2()
{
int i,j,b1,b2;
b1=0;
for (i=h1;i<=r1;i++)
{
b2=0;
for (j=0;j<9;j++)
if (!(ar1[i].s[j]==p.s[j])) b2=1;
if (0==b2)
{
r1=i;
b1=1;
}
}
return(b1);
}
/*out()函数和out1()用来确定输出*/
void out1(struct bsm m)
{ int i;
clrscr();/*清屏函数*/
for(i=0;i<9;i++){if(m.s[i]==0)m.s[i]=m.s[i]+48-16;
else m.s[i]=m.s[i]+48;}
printf("\n\n\t\t CHONG PAI JIU GONG YAN SHI \tStep %d",step);
printf("\n\n\n\n\n\t\t\t%c\t%c\t%c\n",m.s[0],m.s[1],m.s[2]);
printf("\n\n\t\t\t%c\t%c\t%c\n",m.s[3],m.s[4],m.s[5]);
printf("\n\n\t\t\t%c\t%c\t%c\n",m.s[6],m.s[7],m.s[8]);
step++;
sleep(1);/*CPU暂时停止工作1秒钟*/
}
void out()
{
int i,j,k;
int arr[1000];
j=-1;
while (r1>0)
{
j=j+1;
arr[j]=r1;
r1=ar1[r1].prep;
}
j=j+1;
arr[j]=r1;
for (i=j;i>-1;i--)
{
out1(ar1[arr[i]]);
}
while (r2>0)
{
out1(ar2[ar2[r2].prep]);
r2=ar2[r2].prep;
if(r2==0)
out2();
}
}
out2()
{clrscr();
printf("step=%d",step-1);
printf("\n\n\n\n\n\n\n\n\n\t\t\t\tTheEnd\n\n\n\n\n\n\n\n\n\n");
getch();
exit(0);
}
/*主函数*/
void main()
{int i,j,n=0;
step=0;
textcolor(LIGHTGREEN);
clrscr();
printf("Please Input Zheng Shu 0-8 (0 for space):\n");
for (i=0;i<9;i++)
{scanf("%d",&ar1[0].s[i]);
if (0==ar1[0].s[i])
ar1[0].pos=i; /*初始矩阵中0的位置*/
}
if(test())
{for(i=0;i<9;i++)
ar2[0].s[i]=(i+1)%9;
ar2[0].pos=8;/*目标矩阵中0的位置*/
}
else
{ar2[0].s[0]=1;ar2[0].s[1]=2;ar2[0].s[2]=3; ar2[0].s[3]=8;
ar2[0].s[4]=0;ar2[0].s[5]=4;ar2[0].s[6]=7;ar2[0].s[7]=6;
ar2[0].s[8]=5;
ar2[0].pos=4;}
i=0;
for(i=0;i<9;i++)
if(ar1[0].s[i]!=ar2[0].s[i])
n=1;
if(n==0)
{printf("\nNo need to turn it\n");
getch();return;}
ar1[0].prep=-1;
ar2[0].prep=-1;
h1=0;r1=0;h2=0;r2=0;
while(((h1<=r1)&&(r1<1350))||((h2<=r2)&&(r2<1350)))
{
if ((h1<=r1)&&(r1<1350))/*从初始矩阵开始搜索*/
{
p=ar1[h1];
if (p.pos>2)/*若初始矩阵中0的位置大于2的情况*/
{
if (1==pd(-3))/*0向上移动*/
{
p.prep=h1;
r1++;
ar1[r1]=p;
if (1==pd1())
{
out();return;
}
}
}
p=ar1[h1];
if (p.pos%3>0) /*若初始矩阵中0的位置对3取余大于0的情况*/
{
if (1==pd(-1))/*0向左移动*/
{
p.prep=h1;
r1++;
ar1[r1]=p;
if (1==pd1())
{
out();return;
}
}
}
p=ar1[h1];
if (p.pos<6)/*若初始矩阵中0的位置小于6的情况*/
{
if (1==pd(3))/*0向下移动*/
{
p.prep=h1;
r1++;
ar1[r1]=p;
if (1==pd1())
{
out();return;
}
}
}
p=ar1[h1];
if (p.pos%3<2)/*若初始矩阵中0的位置对3取余小于2的情况*/
{
if (1==pd(1))/*0向右移动*/
{
p.prep=h1;
r1++;
ar1[r1]=p;
if (1==pd1())
{
out();return;
}
}
}
h1++;
}
if ((h2<=r2)&&(r2<1350))/*从目标矩阵开始搜索*/
{
p=ar2[h2];
if (p.pos>2)/* 若目标矩阵中0的位置大于2的情况*/
{
if (1==pd0(-3))/*0向上移动*/
{
p.prep=h2;
r2++;
ar2[r2]=p;
if (1==pd2())
{
out();return;
}
}
}
p=ar2[h2];
if (p.pos%3>0) /*若目标矩阵中0的位置对3取余大于0的情况*/
{
if (1==pd0(-1))/*0向左移动*/
{
p.prep=h2;
r2++;
ar2[r2]=p;
if (1==pd2())
{
out();return;
}
}
}
p=ar2[h2];
if (p.pos<6)/*若目标矩阵中0的位置小于6的情况*/
{
if (1==pd0(3))/*0向下移动*/
{
p.prep=h2;
r2++;
ar2[r2]=p;
if (1==pd2())
{
out();return;
}
}
}
p=ar2[h2];
if (p.pos%3<2)/*若目标矩阵中0的位置对3取余小于2的情况*/
{
if (1==pd0(1))/*0向右移动*/
{
p.prep=h2;
r2++;
ar2[r2]=p;
if (1==pd2())
{
out();return;
}
}
}
h2++;
}
}
if (step==0) {printf("\nI cannot find the answer!");
getch();}
}
以上程序还有错误—— 不是所有的情况都可以解决,再次声明 ,本程序借用了上面的乌龙魔法师的思想和整体框架,传上本程序只是为了提供多一份的资料, 以解急需者!