| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1704 人关注过本帖
标题:[求助]八数码问题程序无法显示结果
只看楼主 加入收藏
wish12345
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-4
收藏
得分:0 

经过几天努力和他人的帮助,根据上面的程序进行了修改,以下为程序:
#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();}
}
以上程序还有错误—— 不是所有的情况都可以解决,再次声明 ,本程序借用了上面的乌龙魔法师的思想和整体框架,传上本程序只是为了提供多一份的资料, 以解急需者!

2006-07-10 09:54
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 
感觉乱乱.不太好使呀...

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-07-10 10:23
ccjamting
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-7-10
收藏
得分:0 
对论坛灰心,以被本人删除。

[此贴子已经被作者于2006-7-31 16:47:25编辑过]


即非出自名门,又系旁门左道,我,就这样笑着。
2006-07-10 16:29
快速回复:[求助]八数码问题程序无法显示结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030676 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved