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

用广度优先搜索解决八数码问题,没有语法错误,但调试的时候程序卡在for(i=0;n<40;i++)
{
if(base[n].extend=='Y')
{
没法运行~无法显示出结果,我看了半天也没找出问题,请大家帮忙下。在此拜谢~
/*用广度优先搜索*/
#include<stdio.h>
#include<conio.h>

int n,m;
typedef struct Node
{
char matrix[9];/*存储矩阵*/
char operate;/*存储不可以进行的操作,L代表不能左移,R代表不能右移,U代表不能上移,D代表不能下移*/
char extend;/*是否可以扩展,Y代表可以,N代表不可以*/
int father;/*指向产生自身的父结点*/
}Node;
Node base[40];

char start[9];
char end[9]; /*最终目标*/
int result[10];/*存放结果的base数组下标号,逆序存放*/

int match()/*判断是否为目标*/
{
int i;
for(i=0;i<9;i++)
{
if(base[n-1].matrix[i]!=end[i])
{
return 0;
}
}
return 1;
}

void show()/*显示矩阵的内容*/
{
int i=1;
while(m>=0)
{
int mm=result[m];
clrscr();
printf("\n\n\n\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[0],base[mm].matrix[1],base[mm].matrix[2]);
printf("\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[3],base[mm].matrix[4],base[mm].matrix[5]);
printf("\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[6],base[mm].matrix[7],base[mm].matrix[8]);
sleep(1);
m--;
i++;
}
}

void leave()/*推理成功后退出程序之前要执行的函数,主要作用是输出结果*/
{
n--;
while(base[n].father!=-1)
{
result[m]=n;
m++;
n=base[n].father;
}
result[m]=0;
result[m+1]='\0';
show();
clrscr();
printf("\n\n\n\n\n\n\n\n\n\t\t\t\tThe End\n\n\n\n\n\n\n\n\n\n");
getch();
exit(0);
}

int left(int x)/*把下标为X的数组中的矩阵的空格左移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==0||i==3||i==6||i==9)
{
return 0;
}

/*for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}*/
ch=base[n].matrix[i-1];
base[n].matrix[i-1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='R';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}


int right(int x)/*把下标为X的数组中的矩阵的空格右移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==2||i==5||i==8||i==9)
{
return 0;
}

/*for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}*/
ch=base[n].matrix[i+1];
base[n].matrix[i+1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='L';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}

int up(int x)/*把下标为X的数组中的矩阵的空格上移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==0||i==1||i==2||i==9)
{
return 0;
}

/*for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}*/
ch=base[n].matrix[i-3];
base[n].matrix[i-3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='D';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}

int down(int x)/*把下标为X的数组中的矩阵的空格下移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==6||i==7||i==8||i==9)
{
return 0;
}

/*for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}*/
ch=base[n].matrix[i+3];
base[n].matrix[i+3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='U';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}


main()
{
int i;
char a[9],b[9];
n=0;

textcolor(LIGHTGREEN);
clrscr();

/*以下是输入初始和目标矩阵,并把输入的0转换为空格*/
printf("Please input the start 9 chars:");
for(i=0;i<9;i++)
scanf("%s",&a[i]);
printf("Please input the end 9 chars:");
for(i=0;i<9;i++)
scanf("%s",&b[i]);
for(i=0;i<9;i++)
{
start[i]=a[i];
end[i]=b[i];
if(a[i]=='0') start[i]=' ';
if(b[i]=='0') end[i]=' ';
}


for(i=0;i<9;i++) /*是为第一个base数组元素赋值*/
{
base[0].matrix[i]=start[i];
}
base[0].operate='N';
base[0].extend='Y';
base[0].father=-1;


for(i=0;n<40;i++)
{
if(base[n].extend=='Y') /*运行到此处无法进行*/
{

if(base[n].operate=='L')
{
right(i);up(i);down(i);
}
if(base[n].operate=='R')
{
left(i);up(i);down(i);
}
if(base[n].operate=='U')
{
left(i);right(i);down(i);
}
if(base[n].operate=='D')
{
left(i);right(i);up(i);
}
if(base[n].operate=='N')
{
left(i);right(i);up(i);down(i);
}

}
}

}

[此贴子已经被作者于2006-6-7 21:29:10编辑过]

搜索更多相关主题的帖子: 数码 结果 
2006-06-07 21:14
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
不在其位、不谋其政。铁路警察、各管一段。
请发往数据结构与算法论坛,那论坛有高人。

[此贴子已经被作者于2006-6-8 5:28:30编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-08 05:26
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

呵呵,我数据结构还没学到那里。
再说,您的程序太长,会累死人~
其实,版主的建议不错,您不妨考虑下。


对不礼貌的女生收钱......
2006-06-08 19:47
罗彬
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2006-4-24
收藏
得分:0 

就是,我也认为是这样的哈


2006-06-08 21:40
乌龙魔法师
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-6-7
收藏
得分:0 

改正确了,发出来给大家分享:
#include<stdio.h>
#include<conio.h>

int n,m;
typedef struct Node
{
char matrix[10];/*存储矩阵*/
char operate;/*存储不可以进行的操作,L代表不能左移R代表不能右移U代表不能上移D代表不能下移*/
char extend;/*是否可以扩展,Y代表可以,N代表不可以*/
int father;/*指向产生自身的父结点*/
}Node;
char start[10];
char end[10];
Node base[4000];
int result[100];/*存放结果的base数组下标号,逆序存放*/
int match()/*判断是否为目标*/
{
int i;
for(i=0;i<9;i++)
{
if(base[n-1].matrix[i]!=end[i])
{
return 0;
}
}
return 1;
}

void show()/*显示矩阵的内容*/
{
int i=1;
while(m>=0)
{
int mm=result[m];
clrscr();
printf("\n\n\n SuWei \t\tStep %d",i);
printf("\n\n\n\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[0],base[mm].matrix[1],base[mm].matrix[2]);
printf("\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[3],base[mm].matrix[4],base[mm].matrix[5]);
printf("\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[6],base[mm].matrix[7],base[mm].matrix[8]);
sleep(1);
m--;
i++;
}
}

void leave()/*推理成功后退出程序之前要执行的函数,主要作用是输出结果*/
{
n--;
while(base[n].father!=-1)
{
result[m]=n;
m++;
n=base[n].father;
}
result[m]=0;
result[m+1]='\0';
show();
clrscr();
printf("\n\n\n\n\n\n\n\n\n\t\t\t\tThe End\n\n\n\n\n\n\n\n\n\n");
getch();
exit(0);
}

int left(int x)/*把下标为X的数组中的矩阵的空格左移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==0||i==3||i==6||i==9)
{
return 0;
}

for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i-1];
base[n].matrix[i-1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='R';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}


int right(int x)/*把下标为X的数组中的矩阵的空格右移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==2||i==5||i==8||i==9)
{
return 0;
}

for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i+1];
base[n].matrix[i+1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='L';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}

int up(int x)/*把下标为X的数组中的矩阵的空格上移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==0||i==1||i==2||i==9)
{
return 0;
}

for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i-3];
base[n].matrix[i-3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='D';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}

int down(int x)/*把下标为X的数组中的矩阵的空格下移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
if(base[x].matrix[i]==' ')
break;
}
if(i==6||i==7||i==8||i==9)
{
return 0;
}

for(j=0;j<9;j++)
{
base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i+3];
base[n].matrix[i+3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='U';
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match(i))
leave();
return 1;
}


main()
{
int i;
char a[20],b[20];
n=1;

textcolor(LIGHTGREEN);
clrscr();

/*以下是输入初始和目标矩阵,并把输入的0转换为空格*/
printf("Please input the start 9 chars:");
scanf("%s",a);
printf("Please input the end 9 chars:");
scanf("%s",b);
for(i=0;i<9;i++)
{
if(a[i]=='0')
{
start[i]=' ';
continue;
}
if(b[i]=='0')
{
end[i]=' ';
continue;
}
start[i]=a[i];
end[i]=b[i];
}
start[9]='\0';
end[9]='\0';


for(i=0;i<9;i++)
{
base[0].matrix[i]=start[i];
}
base[0].operate='N';
base[0].extend='Y';
base[0].father=-1;
/*以上是为第一个base数组元素赋值*/

for(i=0;n<4000;i++)
{
if(base[i].extend=='Y')
{
if(base[i].operate=='L')
{
right(i);up(i);down(i);
}
if(base[i].operate=='R')
{
left(i);up(i);down(i);
}
if(base[i].operate=='U')
{
left(i);right(i);down(i);
}
if(base[i].operate=='D')
{
left(i);right(i);up(i);
}
if(base[i].operate=='N')
{
left(i);right(i);up(i);down(i);
}
}
}
}

2006-06-10 20:17
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
谢谢你的钻研精神,谢谢你的成果共享。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-10 21:13
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
输入的数有什么要求没有
我输入 123456789
987654321
怎么什么结果也没有??

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2006-06-14 01:34
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
int i;
char a[9],b[9];
n=0;

textcolor(LIGHTGREEN);
clrscr();

/*以下是输入初始和目标矩阵,并把输入的0转换为空格*/
printf("Please input the start 9 chars:");
for(i=0;i<9;i++)
scanf("%s",&a[i]); //似应为 %c
printf("Please input the end 9 chars:");
for(i=0;i<9;i++)
scanf("%s",&b[i]); //似应为 %c


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-14 05:59
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
楼主的代码有以下可改进之处;
(1)代码过长,重复代码很多(像up,down,right和left)
(2)多分支结构用switch来更加清晰
(3)match函数可以使用高效的库函数memcmp来代替
(4)广搜没必要记录父节点,当然如果为了防止走回原来的步骤这么做的确有一定效果,但是这样做是不彻底的(只能够防止不走回前一步)判重操作有待进一步改善

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-06-14 08:01
wish12345
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-4
收藏
得分:0 

看了上面的改正程序,不过还是无法得出正确结果 。
不知是否还有再改正的程序?急需!急需!!急需!!!

2006-07-04 09:42
快速回复:[求助]八数码问题程序无法显示结果
数据加载中...
 
   



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

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