码迷,mamicode.com
首页 > 编程语言 > 详细

广度优先算法:迷宫问题

时间:2015-04-06 11:22:02      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

广度优先算法:

 

模拟队列:数据量较小,需要打印路径坐标

STL队列:数据量较大,只需要打印步数

 

迷宫问题

 

Description

定义一个二维数组:

int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
技术分享
 1 #include <stdio.h>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 const int MAX = 5;
 7 const int x[] = { -1, 0, 1, 0 };
 8 const int y[] = { 0, 1, 0, -1 };
 9 
10 struct point
11 {
12     int x, y, pre;
13     point(){};
14     point(int _x, int _y, int _pre) : x(_x), y(_y), pre(_pre){};
15 };
16 
17 point que[MAX * MAX];
18 int arr[MAX][MAX];
19 bool vis[MAX][MAX];
20 
21 void BFS();
22 void Print(int n);
23 
24 int main()
25 {
26 #ifdef OFFLINE
27     freopen("input.txt", "r", stdin);
28     freopen("output.txt", "w", stdout);
29 #endif
30 
31     memset(que, 0, sizeof(que));
32     memset(arr, 0, sizeof(arr));
33     memset(vis, 0, sizeof(vis));
34 
35     for (int i = 0; i < MAX; i++)
36     {
37         for (int j = 0; j < MAX; j++)
38         {
39             scanf("%d", &arr[i][j]);
40         }
41     }
42 
43     BFS();
44 
45     return 0;
46 }
47 
48 void BFS()
49 {
50     int qh = 0, qt = 0;
51     que[qt++] = point(0, 0, -1);
52     vis[0][0] = true;
53 
54     while (qh < qt)
55     {
56         if (que[qh].x == 4 && que[qh].y == 4)
57         {
58             Print(qh);
59             return;
60         }
61 
62         for (int i = 0; i < 4; i++)
63         {
64             int nx = que[qh].x + x[i], ny = que[qh].y + y[i], npre = qh;
65             if (nx >= 0 && nx < MAX && ny >= 0 && ny < MAX && !arr[nx][ny] && !vis[nx][ny])
66             {
67                 que[qt++] = point(nx, ny, npre);
68                 vis[nx][ny] = true;
69             }
70         }
71 
72         qh++;
73     }
74 
75     return;
76 }
77 
78 void Print(int n)
79 {
80     if (n == -1) return;
81     Print(que[n].pre);
82     printf("(%d, %d)\n", que[n].x, que[n].y);
83 }
View Code

 

广度优先算法:迷宫问题

标签:

原文地址:http://www.cnblogs.com/gwsbhqt/p/4395515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!