题目:
迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13146 | Accepted: 7876 |
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了。
题解:迷宫问题是经典的bfs,从出发点开始,把每一步能走到的点都做上标记,由于这个还需要把路径输出,所以记录每个点的前一个点的坐标(每一个点有很多的后一个点,所以不能记录后一个点的)。我的做法是从终点开始回溯压栈,最后到起点开始弹出并输入。
代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <iostream>
#include <cstring>
using namespace std;
queue<pair<int, int> > q;
stack<pair<int, int> > s;
bool vis[25][25], map[25][25];
pair<int, int> pre11[25][25];
int cnt;
void init()
{
memset(vis, false, sizeof(vis));
memset(map, false, sizeof(map));
if (!q.empty())
q.pop();
int cnt = 1;
}
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
int main()
{
//freopen("input.txt", "r", stdin);
init();
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
int a;
cin >> a;
if (a == 0)
map[i][j] = true;
else
map[i][j] = false;
}
}//load
q.push(make_pair(0, 0));
vis[0][0] = true;
int x, y, X, Y;
while (!q.empty())
{
x = q.front().first;
y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
X = x + dx[i]; Y = y + dy[i];
if (X < 0 || X >= 5 || Y < 0 || Y >= 5 || map[X][Y] == false || vis[X][Y])
continue;
vis[X][Y] = true;
pre11[X][Y] = make_pair(x, y);
q.push(make_pair(X, Y));
}
}
X = Y = 4;
while (X != 0 || Y != 0)
{
s.push(make_pair(X, Y));
int x = pre11[X][Y].first;
int y = pre11[X][Y].second;
X = x;
Y = y;
}
printf("(0, 0)\n");
while (!s.empty())
{
printf("(%d, %d)\n", s.top().first, s.top().second);
s.pop();
}
return 0;
}
由于有记录过程的操作,所以考虑dfs可以一路走到黑的性质,在dfs函数中添加参数来记录路径,以及满足条件的当前最优解,如果另外的走法满足条件且优于最优解就更新那个值,总的路径数组也更换成这条路径。