時間限制: 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");
}
}