1410: Litmxs找女友
题目描述
Litmxs 是个肥宅,很少出门.可是在11.11那天,他做梦梦到女朋友被困在了地铁站,他必须去接她.他想选择一条最快的路,接到他的女朋友.
问题是这样的.每次下大雨的时候,ZSTU就变成了浙江游泳大学,从寝室到校区,水茫茫一片.只有部分道路可以走人.我们假定ZSTU是一个N*M的地图.Litmxs在寝室(1,1),而地铁站的位置在(n,m),有些地方因为被水淹没了,不能过人.每次只能上下左右走一步,每一步耗时1S.请你告诉他接到女朋友的所花费的时间最少是多少。如果不能找到输出-1.
输入
先输入一个T,代表有T组测试数据。每组测试数据输入两个整数n,m.接下来是nm(n行m列)的地图 ‘.’代表可走,’’代表被水淹没(T<=100,2<=n<=5e2,2<=m<=5e2,保证max(n, m)>50的数据小于5组)
输出
每组输出一个数字占一行;
样例输入
1
4 4
…**
.*
…
…*.
样例输出
6
提示
样例解释:(1,1) →(1,2) →(2,2) →(3,2) →(3,3) →(3,4) →(4,4)
提示:由于数据较大,请用scanf读入
一、解题思路
因为是求最短时间,所以应该用广搜,当到达目的地时输出答案即可。
二、源代码 (我用数组模拟队列)
#include <bits/stdc++.h>
using namespace std;
const int MAXN=5e2+10;
int t,n,m;
char a[MAXN][MAXN];
bool pd[MAXN][MAXN];
int zb[4][2]= {1,0,0,1,-1,0,0,-1};
struct s
{
int x,y;
int time;
} que[250010];
void BFS()
{
int head=1;
int tail=1;
que[tail].x=0;
que[tail].y=0;
que[tail].time=0;
tail++;
memset(pd,0,sizeof(pd));
pd[0][0]=1;
while(head<tail)
{
if(que[head].x==n-1&&que[head].y==m-1)
{
printf("%d\n",que[head].time);
return;
}
for(int i=0; i<4; i++)
{
int tx=que[head].x+zb[i][0];
int ty=que[head].y+zb[i][1];
if(0<=tx&&tx<n&&0<=ty&&ty<m&&!pd[tx][ty]&&a[tx][ty]!='*')
{
que[tail].x=tx;
que[tail].y=ty;
que[tail].time=que[head].time+1;
pd[que[tail].x][que[tail].y]=1;
tail++;
}
}
head++;
}
printf("-1\n");
return;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)scanf("%s",a[i]);
BFS();
}
return 0;
}
1732

被折叠的 条评论
为什么被折叠?



