迷宫问题
- 描述 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 }

浙公网安备 33010602011771号