题目链接:http://210.41.166.247/problem.php?cid=1020&pid=5
问题 F: 迷宫问题
时间限制: 1 Sec 内存限制: 32 MB
提交: 9 解决: 5
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。
输入
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。
样例输入
1 5 5 S-### ----- ##--- E#--- ---##
样例输出
9
解题思路:初略的扫了一下题面,就大概知道这道题是一道搜索题。而且典型的板子题。这是我们比赛时的一道题,因为行列上限是100。比赛时为了保险怕爆栈,所以我用的是BFS来做的,而且题目本身要求求出最短路径,所以用bfs来做也比较合理。与bfs的模板没有太大差异和变化。所以按着思路来写就可以了。用一个标志flag,找到目标就更新flag,然后return。若flag未更新,则未找到该目标。
AC代码:
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
char m[110][110];
int M[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int in;
int flag;
int n, z;
struct pos{
int x;
int y;
int num;
};
void bfs(int i, int j)
{
int di, dj;
int k;
pos e, t;
queue<pos> ans;
e.x = i;
e.y = j;
e.num = 0;
ans.push(e);
while(!ans.empty())
{
e = ans.front();
ans.pop();
for(k = 0; k < 4; ++k)
{
di = e.x + M[k][0];
dj = e.y + M[k][1];
if(di >= 0 && di < n && dj >= 0 && dj < z && m[di][dj] != '#')
{
if(m[di][dj] == 'E')
{
flag = 1;
in = e.num + 1;
return;
}
t.x = di;
t.y = dj;
t.num = e.num + 1;
ans.push(t);
m[di][dj] = '#';
}
}
} //printf("%d %d\n", e.x, e.y);
}
int main()
{
int t;
int i, j;
scanf("%d", &t);
while(t--)
{
flag = 0;
scanf("%d%d", &n, &z);
for(i = 0; i < n; ++i)
{
scanf("%s", m[i]);
}
for(i = 0; i < n; ++i)
for(j = 0; j < z; ++j)
{
if(m[i][j] == 'S')
{
bfs(i, j);
break;
}
}
if(flag)
printf("%d\n", in);
else
printf("-1\n");
}
return 0;
}