迷宫问题?
下面是我写的一个迷宫,我用随机数产生迷宫,然后寻找出口,可是老是输出找不到出口,于是把迷宫改小,输出迷宫,用眼睛扫描了一下,有些是有出口的,但输出却是找不到出口,不得不怀疑程序错了,可是我找了半天,还是找不到。呵呵,麻烦大家帮我看一下,哪里不行。有写个迷宫的朋友也可以把你的代码发上来,我自已研究。谢谢!!!
以下是我的代码:
[size=2]/********************************************************
** Highlight software by yzfy(雨中飞燕) http:// *
*********************************************************/
#include<iostream>
#include<ctime>
using namespace std;
const int m=5,p=5; //迷宫的行数和列数
struct offsets //前进方向表的结构定义
{
int a,b; //a,b是x,y(SeekPath函数参数)方向的偏移
char *dir; //dir是方向
};
offsets move[8]; //各个方向的偏移表
int Maze[m+2][p+2]; //迷宫定义
int mark[m+2][p+2]; //访问标记数组
int main()
{
int SeekPath(int,int);
int i,j;
srand(unsigned(time(NULL)));
offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
{1,0,"SE"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
for(i=0;i<m+2;i++) //用随机数产生为宫
{
for(j=0;j<p+2;j++)
Maze[i][j]=rand()%2;
}
for(i=0;i<m+2;i++) //访问标记数组初始为零
for(j=0;j<p+2;j++)
mark[i][j]=0;
cout<<"The maze is:"<<endl; //输出刚才产生的迷宫
for(i=0;i<m+2;i++)
{
for(j=0;j<p+2;j++)
cout<<Maze[i][j];
cout<<endl;
}
mark[1][1]=1; //从入口[1][1]开始
if(SeekPath(1,1)) //调用求解迷宫的递归算法
cout<<"("<<1<<","<<1<<"(,"<<"Direction"<<"E"<<endl;
system("pause");
return 0;
}
int SeekPath(int x,int y)
{
//从迷宫某一位置开始,寻找通向出口[M][P]的一条路径。如果找到,返回1,否刚返回0;
//试探的出发点为[1][1].
int i,g,h; //用G,H记录位置信息,DIR记方向
char *d;
if(x==m&&y==p)
return 1; //到达出口,返回1;
for(i=0;i<8;i++)
{
g=x+move[i].a;
h=y+move[i].b;
d=move[i].dir; //找下一位置和方向(a,b,dir)
if(Maze[g][h]==0&&mark[g][h]==0)
{
mark[g][h]=1;
if(SeekPath(g,h)) //从此位置递归试探
{
cout<<"("<<g<<","<<h<<"),"<<"Direction"<<move[i].dir<<",";
return 1; //试探成功,逆向输出路径坐标
}
}
}
if(x==1&&y==1)
cout<<"no path in Maze"<<endl;
return 0;
}
[/size]** Highlight software by yzfy(雨中飞燕) http:// *
*********************************************************/
#include<iostream>
#include<ctime>
using namespace std;
const int m=5,p=5; //迷宫的行数和列数
struct offsets //前进方向表的结构定义
{
int a,b; //a,b是x,y(SeekPath函数参数)方向的偏移
char *dir; //dir是方向
};
offsets move[8]; //各个方向的偏移表
int Maze[m+2][p+2]; //迷宫定义
int mark[m+2][p+2]; //访问标记数组
int main()
{
int SeekPath(int,int);
int i,j;
srand(unsigned(time(NULL)));
offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
{1,0,"SE"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
for(i=0;i<m+2;i++) //用随机数产生为宫
{
for(j=0;j<p+2;j++)
Maze[i][j]=rand()%2;
}
for(i=0;i<m+2;i++) //访问标记数组初始为零
for(j=0;j<p+2;j++)
mark[i][j]=0;
cout<<"The maze is:"<<endl; //输出刚才产生的迷宫
for(i=0;i<m+2;i++)
{
for(j=0;j<p+2;j++)
cout<<Maze[i][j];
cout<<endl;
}
mark[1][1]=1; //从入口[1][1]开始
if(SeekPath(1,1)) //调用求解迷宫的递归算法
cout<<"("<<1<<","<<1<<"(,"<<"Direction"<<"E"<<endl;
system("pause");
return 0;
}
int SeekPath(int x,int y)
{
//从迷宫某一位置开始,寻找通向出口[M][P]的一条路径。如果找到,返回1,否刚返回0;
//试探的出发点为[1][1].
int i,g,h; //用G,H记录位置信息,DIR记方向
char *d;
if(x==m&&y==p)
return 1; //到达出口,返回1;
for(i=0;i<8;i++)
{
g=x+move[i].a;
h=y+move[i].b;
d=move[i].dir; //找下一位置和方向(a,b,dir)
if(Maze[g][h]==0&&mark[g][h]==0)
{
mark[g][h]=1;
if(SeekPath(g,h)) //从此位置递归试探
{
cout<<"("<<g<<","<<h<<"),"<<"Direction"<<move[i].dir<<",";
return 1; //试探成功,逆向输出路径坐标
}
}
}
if(x==1&&y==1)
cout<<"no path in Maze"<<endl;
return 0;
}
[[it] 本帖最后由 zjl138 于 2008-5-6 11:09 编辑 [/it]]