Problem:Litmxs找女友
Description:
Litmxs 是个肥宅,很少出门.可是在11.11那天,他做梦梦到女朋友被困在了地铁站,他必须去接她.他想选择一条最快的路,接到他的女朋友.
问题是这样的.每次下大雨的时候,ZSTU就变成了浙江游泳大学,从寝室到校区,水茫茫一片.只有部分道路可以走人.我们假定ZSTU是一个N*M的地图.Litmxs在寝室(1,1),而地铁站的位置在(n,m),有些地方因为被水淹没了,不能过人.每次只能上下左右走一步,每一步耗时1S.请你告诉他接到女朋友的所花费的时间最少是多少。如果不能找到输出-1.
Input:
先输入一个T,代表有T组测试数据。每组测试数据输入两个整数n,m.接下来是nm(n行m列)的地图 ‘.’代表可走,’’代表被水淹没(T<=100,2<=n<=5e2,2<=m<=5e2,保证max(n, m)>50的数据小于5组)
Output:
每组输出一个数字占一行;
Sample Input:
1
4 4
…**
.*
…
…*.
Sample Output:
6
Note:
样例解释:(1,1) →(1,2) →(2,2) →(3,2) →(3,3) →(3,4) →(4,4)
提示:由于数据较大,请用scanf读入
Language:C++
#include
#include
#include
using namespace std;
const int N=5e2+10;
int n,m;
char s[N][N];
bool vis[N][N];
int step[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x;
int y;
int cnt;
}f,g;
void bfs()
{
queue<node>q;
f.x=1;
f.y=1;
f.cnt=0;
q.push(f);
vis[1][1]=1;
while(!q.empty())
{
f=q.front();
q.pop();
if(f.x==n&&f.y==m)
{
cout<<f.cnt<<endl;
return;
}
for(int i=0;i<4;i++)
{
int tx=f.x+step[i][0];
int ty=f.y+step[i][1];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m)
{
if(s[tx][ty]=='.'&&!vis[tx][ty])
{
g.x=tx;
g.y=ty;
g.cnt=f.cnt+1;
vis[tx][ty]=1;
q.push(g);
}
}
}
}
cout<<-1<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>s[i][j];
}
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}