求助:迷宫问题

cs4281 2003-08-19 04:26:14
迷宫问题
问题描述:
以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
基本要求:
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫的一个坐标,d表示走到下一个坐标的方向(左--1,下--2,右--3,上--4,当然也可用汉字代替)。如:对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2)……
测试数据:
迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。











实现提示:
计算机解迷宫问题通常用的是回溯发,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路回退,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能达到出口,则所有设定的迷宫没有通路。
可以二维数组存储迷宫数据,通常设定入口点下标为(1,1),出口点下标为(n,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。

求能在visual c++ 6.0环境下能测试通过的源代码,谢谢!
...全文
295 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs4281 2003-08-20
  • 打赏
  • 举报
回复
用vc++ 如何随机生成迷宫?

这一步总是出错阿!苦恼阿!郁闷阿~
lemonutzf 2003-08-19
  • 打赏
  • 举报
回复
class list
{
public:
int x;
int y;
list* next;
public:
list(int a,int b)
{
x=a;y=b;
next=NULL;
}
};

int avail[m][n];

BOOL path(int x1,int y1,int x2,int y2)
{
BOOL flag=TRUE;
list* head=new list(x1,y1);
list* cur=head;
list* tail=head;
while(flag && cur)
{
if(cur->x-1>=0 && !avail[cur->x-1][cur->y])
{
avail[cur->x-1][cur->y]=4;
tail->next=new list(cur->x-1,cur->y);
tail=tail->next;
if(cur->x-1==x2 && cur->y==y2)
flag=FALSE;
}
if(cur->x+1<=9 && !avail[cur->x+1][cur->y])
{
avail[cur->x+1][cur->y]=4;
tail->next=new list(cur->x+1,cur->y);
tail=tail->next;
if(cur->x+1==x2 && cur->y==y2)
flag=FALSE;
}
if(cur->y-1>=0 && !avail[cur->x][cur->y-1])
{
avail[cur->x][cur->y-1]=4;
tail->next=new list(cur->x,cur->y-1);
tail=tail->next;
if(cur->x==x2 && cur->y-1==y2)
flag=FALSE;
}
if(cur->y+1<=9 && !avail[cur->x][cur->y+1])
{
avail[cur->x][cur->y+1]=4;
tail->next=new list(cur->x,cur->y+1);
tail=tail->next;
if(cur->x==x2 && cur->y+1==y2)
flag=FALSE;
}
cur=cur->next;
}
if(cur)
flag=TRUE;
else
flag=FALSE;
cur=head;
while(cur)
{
head=cur;
cur=cur->next;
int temp=0;
if(cur.x==head.x) ++temp;
if(cur.x>head.x) temp+=2;
if(cur.y==head.y) ++temp;
if(cur.y>head.y) temp+=2;
std::cout<<'('<<head.x<<','<<head.y<<','<<temp<<')'<<std::endl;
delete head;
}
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(avail[i][j]==4)
avail[i][j]=0;
return flag;
}
ZhangYv 2003-08-19
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1709/1709544.xml?temp=.3377497
自己去改改吧
cs4281 2003-08-19
  • 打赏
  • 举报
回复
急需!谢谢!

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧