C++解决最基本的迷宫问题

发表于:2015-4-28 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:盛夏落木    来源:51Testing软件测试网采编

  问题描述:给定一个最基本的迷宫图,用一个数组表示,值0表示有路,1表示有障碍物,找一条,从矩阵的左上角,到右下角的最短路。求最短路,大家最先想到的可能是用BFS求,本文也是BFS求最短路的。
  源代码如下:
1 /*
2 使用BFS解决迷宫问题
3
4
5 **/
6 #include<iostream>
7 #include<queue>
8 #include<vector>
9 using namespace std;
10 struct MaNode{
11     int x;
12     int y;
13     MaNode *pre;
14     MaNode(int x1=0,int y1=0,MaNode *p =NULL ):x(x1),y(y1),pre(p)
15     {
16     }
17 };
18 const int maxr=5;
19 const int maxc=5;
20 queue<MaNode*> qmaze;
21 vector<MaNode*> vemaze; //保存节点,以便释放
22
23 int maze[maxr][maxc] = {
24     0,0,0,0,0,
25     0,1,0,1,0,
26     0,0,0,0,0,
27     0,1,1,1,0,
28     0,0,0,1,0,
29  };
30 void visit(int x,int y, MaNode *p )  //访问节点
31 {
32     struct MaNode *p2 = new MaNode(x,y,p);
33     //p2->x = x;
34     //p2->y =y;
35     //  p2->pre = p;
36      maze[x][y] = 2; //标识已经访问
37     qmaze.push(p2);
38 }
39 void bfs() // 宽度优先搜索
40 {
41     MaNode *head = new MaNode;
42     qmaze.push(head);
43     while( !qmaze.empty() )
44     {
45         MaNode *p= qmaze.front();
46         //int x=  p->x+1;
47         //int y= p->y+1;
48         vemaze.push_back(p);
49         qmaze.pop();
50         if( p->x ==maxr-1 && p->y==maxc-1 )
51         {
52              break;
53         }
54         if(p->x +1 <=maxr  && maze[p->x+1][p->y] ==0  )
55         {
56             visit(p->x+1,p->y,p);
57         }
58         if(p->y+1 <=maxc&& maze[p->x][p->y+1] ==0 )
59         {
60           visit(p->x,p->y+1,p);
61         }
62        if( p->x-1 >=0  && maze[p->x-1][p->y] ==0 )
63        {
64
65
66        visit(p->x-1,p->y,p);
67        }
68       if( p->y-1 >=0  && maze[p->x][p->y-1] ==0 )
69        {
70
71        visit(p->x,p->y-1,p);
72        }
73
74     }
75
76
77 }
78 void printPath()  //打印路径
79 {
80     MaNode *p  = vemaze[vemaze.size()-1];
81     while( p != NULL )
82     {
83         cout<<"("<<p->x<<","<<p->y<<")"<<endl;
84
85         p=p->pre;
86     }
87     //cout<<endl;
88 }
89 void destroy()  //销毁节点
90 {
91     for(size_t  i=0; i<vemaze.size() ; i++ )
92     {
93         delete vemaze[i];
94     }
95 }
96 int main()
97 {
98
99
100     bfs();
101     printPath();
102    destroy();
103    return 0;
104 }
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号