(纪中)1193. 迷宫 (Standard IO)【BFS】

时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet


题目描述
北京地图可以看作是RCR*C的网格,奥运会期间对有的地方要进行交通管制,有的地方不允许进入,有的地方对离开时的行驶方向有限制:有的只允许走到上下两个相邻的格子,有的只允许走到左右两个相邻的格子,没有的任何限制的地方上下左右四个方向都允许。

现在给你地图的描述,格子的描述如下:
+“+”表示可以向任意方向(上、下、左、右)移动一格;
“-”表示只能向左右方向移动一格;
“|”表示只能向上下方向移动一格;
“*”表示该位置不能到达。

你的任务是计算出从左上角到右下角的最少需要经过的格子数。


输入
输入第一行一个整数t(1<=t=10)t(1<=t=10)表示有t组测试数据。
每一个测试数据,第一行一个整数rr,第二行一个整数c(1<=r,c<=20)c(1<=r,c<=20)表示地图是rrcc列的,接下来rr行,每行cc个字符,每个字符是+,,,{+,*,-,|}中的一种。你可以假设左上角不会是“*”

输出
输出有tt行,每行一个整数表示对应测试数据所需的最少格子数,如果到达不了右下角输出1-1


样例输入
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");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章