迷宫问题

描述    http://cxsjsxmooc.openjudge.cn/2017t2winterw10/1/

定义一个二维数组:

 

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.

老师说 这题不能用标准模板库里的队列,用个一维数组简单实现个队列;

主要遇到的问题:

    如何判断重复走过;

    最后怎么输出那个路径;   

 1 /*
 2     想清楚对应的状态是什么;就是每一个坐标;
 3 
 4     */
 5 #include<iostream>
 6 #include<cstring>
 7 #include<queue>
 8 using namespace std;
 9 #define Max 10
10 int maze[Max][Max];
11 int visited[Max][Max];
12 int dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
13 struct Node {
14     int r, c;
15     int f;
16     Node ():r(0), c(0), f(0) { }
17     Node(int rr, int cc, int ff):r(rr), c(cc), f(ff) { }
18 
19 };
20 Node Open[Max*Max];
21 int head = 0;
22 int tail = 0;    //头尾指针下标;
23 void F(Node tmp) {
24     if (!tmp.f) {
25         cout << 1 << "," << 1 << endl;
26         cout << tmp.r << "," << tmp.c << endl;
27         return;
28     }
29     F(Open[tmp.f]);
30     cout << tmp.r << "," << tmp.c << endl;
31 }
32 int main() {
33     for (int i = 1; i <= 5; i++)
34         for (int j = 1; j <= 5; j++)
35             cin >> maze[i][j];
36 
37 
38     memset(visited, 0, sizeof(visited));
39 
40     visited[1][1] = 1;
41     Open[tail++] = Node(1, 1, 0);
42     while (head < tail) {    //只要队列不为空;
43         Node tmp = Open[head++];    //取出队头元素;
44         if (tmp.c == 5 && tmp.r == 5) {
45             F(tmp);
46             
47         }
48         for (int i = 0; i < 4; i++) {
49             int r = tmp.r + dir[i][0];
50             int c = tmp.c + dir[i][1];
51             if (0 < r && r <= 5 && 0 < c && c <= 5 && !visited[r][c] && !maze[r][c]) {
52                 Open[tail++] = Node(r, c, head - 1);
53                 visited[r][c] = 1;
54             }
55         }
56     }
57     return 0;
58 }

 

 

posted @ 2018-03-13 19:30  Charlie_li  阅读(102)  评论(0)    收藏  举报