(紀中)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");
    }
}

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