时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
北京地图可以看作是的网格,奥运会期间对有的地方要进行交通管制,有的地方不允许进入,有的地方对离开时的行驶方向有限制:有的只允许走到上下两个相邻的格子,有的只允许走到左右两个相邻的格子,没有的任何限制的地方上下左右四个方向都允许。
现在给你地图的描述,格子的描述如下:
● 表示可以向任意方向(上、下、左、右)移动一格;
● 表示只能向左右方向移动一格;
● 表示只能向上下方向移动一格;
● 表示该位置不能到达。
你的任务是计算出从左上角到右下角的最少需要经过的格子数。
输入
输入第一行一个整数表示有t组测试数据。
每一个测试数据,第一行一个整数,第二行一个整数表示地图是行列的,接下来行,每行个字符,每个字符是中的一种。你可以假设左上角不会是。
输出
输出有行,每行一个整数表示对应测试数据所需的最少格子数,如果到达不了右下角输出。
样例输入
3
2
2
-|
+
3
5
+||+
+++|+
**–+
2
3
++
++
样例输出
3
7
-1
数据范围限制
提示
50% 1<=r,c<=20
100% 1<=r,c<=1000
解题思路
暴力BFS搞定
代码
#include<bits/stdc++.h>
using namespace std;
int n,r,c,m[1010][1010],st[1000010][3],v[1010][1010],h,t;
char a;
void check(int x,int y,int s)
{
if(x>0&&y>0&&x<=r&&y<=c&&m[x][y]!=4&&!v[x][y])
st[++t][1]=x,st[t][2]=y,v[x][y]=s;
return ;
}
void bfs()
{
st[1][1]=1;
st[1][2]=1;
v[1][1]=1;
h=0,t=1;
while(h<t)
{
h++;
int xx=st[h][1],yy=st[h][2],ans=v[xx][yy]+1;
if(m[xx][yy]==1||m[xx][yy]==2)
{
check(xx,yy-1,ans);
check(xx,yy+1,ans);
}
if(m[xx][yy]==1||m[xx][yy]==3)
{
check(xx+1,yy,ans);
check(xx-1,yy,ans);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&r,&c);
memset(m,0,sizeof(m));
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
{
cin>>a;
if(a=='+') m[i][j]=1;
if(a=='-') m[i][j]=2;
if(a=='|') m[i][j]=3;
if(a=='*') m[i][j]=4;
}
}
memset(v,0,sizeof(v));
bfs();
if(v[r][c])
printf("%d\n",v[r][c]);
else
printf("-1\n");
}
}