迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 41913 | Accepted: 23240 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)
这个题BFS模板题,不过,关键点也就是难点在与如何输出最短路。
看这个大佬的博客:https://blog.csdn.net/qq_33279781/article/details/51991835
这个可以用栈保存前驱。
C++代码:
#include<iostream> #include<queue> #include<stack> #include<stdio.h> #include<cstring> using namespace std; typedef pair<int, int> pii; int arr[5][5]; bool vis[5][5]; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; pii pre[6][6]; void print() { stack<pii> s; pii n(4,4); //注意扎实基础。 while (1) { s.push(n); if (n.first == 0 && n.second == 0) break; n = pre[n.first][n.second]; //更新n为n的前驱。 } while (!s.empty()) { cout << "(" << s.top().first << ", " << s.top().second << ")" << endl; //审题,注意格式。 s.pop(); } } void bfs(int i, int j) { queue<pii> q; q.push(pii(i,j)); vis[i][j] = true; while (!q.empty()) { pii tmp = q.front(); q.pop(); if (tmp.first == 4 && tmp.second == 4) { print(); return; } for (int i = 0; i < 4; i++) { int x = tmp.first + dx[i]; int y = tmp.second + dy[i]; if (x >= 0 && x < 5 && y >= 0 && y < 5 && !vis[x][y] && arr[x][y] == 0) { q.push(pii(x,y)); vis[x][y] = true; pre[x][y] = tmp; //保存前驱。 } } } } int main() { memset(arr, 0, sizeof(arr)); memset(vis, false, sizeof(vis)); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) cin >> arr[i][j]; } bfs(0, 0); return 0; }
pair的用法如图: