1193. 迷宫
题目描述
北京地图可以看作是R*C的网格,奥运会期间对有的地方要进行交通管制,有的地方不允许进入,有的地方对离开时的行驶方向有限制:有的只允许走到上下两个相邻的格子,有的只允许走到左右两个相邻的格子,没有的任何限制的地方上下左右四个方向都允许。
现在给你地图的描述,格子的描述如下:
● “+”表示可以向任意方向(上、下、左、右)移动一格;
● “-”表示只能向左右方向移动一格;
● “|”表示只能向上下方向移动一格;
● “*”表示该位置不能到达。
你的任务是计算出从左上角到右下角的最少需要经过的格子数。
输入
输入第一行一个整数t(1<=t=10)表示有t组测试数据。
每一个测试数据,第一行一个整数r,第二行一个整数c(1<=r,c<=20)表示地图是r行c列的,接下来r行,每行c个字符,每个字符是{ + , * , - , | }中的一种。你可以假设左上角不会是“ * ”。
输出
输出有t行,每行一个整数表示对应测试数据所需的最少格子数,如果到达不了右下角输出-1。
样例输入
3
2
2
-|
*+
3
5
+||*+
+++|+
**--+
2
3
+*+
+*+
样例输出
3
7
-1
数据范围限制
提示
50% 1<=r,c<=20
100% 1<=r,c<=1000
bfs模板
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
const int dx[5]={0,-1,1,0,0};
const int dy[5]={0,0,0,-1,1};
int t,r,c,map[1010][1010],que[1000010][3];
bool vis[1010][1010];
char s;
bool check(int x,int y)
{
if(x>=1&&x<=r&&y>=1&&y<=c) return 1;
return 0;
}
bool bfs()
{
memset(vis,0,sizeof(vis));
que[1][0]=1,que[1][1]=1,que[1][2]=0;vis[1][1]=1;
int head=0,tail=1;
while(head<=tail)
{
head++;
int tx=que[head][0],ty=que[head][1],step=que[head][2];
if(tx==r&&ty==c)
{
printf("%d\n",step+1);
return 1;
}
if(map[tx][ty]==1)
{
for(int i=1;i<=4;i++)
{
int nx=dx[i]+tx,ny=dy[i]+ty;
if(!vis[nx][ny]&&check(nx,ny)&&map[nx][ny])
{
vis[nx][ny]=1;
que[++tail][0]=nx;
que[tail][1]=ny;
que[tail][2]=step+1;
}
}
}
if(map[tx][ty]==2)
{
for(int i=3;i<=4;i++)
{
int nx=dx[i]+tx,ny=dy[i]+ty;
if(!vis[nx][ny]&&check(nx,ny)&&map[nx][ny])
{
vis[nx][ny]=1;
que[++tail][0]=nx;
que[tail][1]=ny;
que[tail][2]=step+1;
}
}
}
if(map[tx][ty]==3)
{
for(int i=1;i<=2;i++)
{
int nx=dx[i]+tx,ny=dy[i]+ty;
if(!vis[nx][ny]&&check(nx,ny)&&map[nx][ny])
{
vis[nx][ny]=1;
que[++tail][0]=nx;
que[tail][1]=ny;
que[tail][2]=step+1;
}
}
}
}
return 0;
}
int main()
{
//fre();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
cin>>s;
if(s=='*') map[i][j]=0;
if(s=='+') map[i][j]=1;
if(s=='-') map[i][j]=2;
if(s=='|') map[i][j]=3;
}
if(!bfs()) printf("-1\n");
}
return 0;
}