1193. 迷宫

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;
}

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/106732213
今日推荐