CSUOJ 1939 World's end BFS 仔细思考

版权声明:也还是请注明一下原地址,虽然写的不是很好。。。 https://blog.csdn.net/Good_night_Sion_/article/details/72795474

Description

Given a n × m matrix. Each cell is “.” for a road, or is “#” for a wall. A girl stood at ‘S’ and she wanted to know whether she can walk infinitely far away from her now position.we know the matrix is noly the part of the world and if cell (x, y) is a road ,then cell ( x mod n , y mod m ) is a road. if cell (x, y) is a wall ,then cell ( x mod n , y mod m ) is a wall.If the girl is in position(x, y), the following of she can go is (x, y - 1), (x, y + 1), (x - 1, y) and (x + 1, y).

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 1500) — the height and the width of the matrix.Each of the next n lines contains m characters.

Output

Print "Yes" (without the quotes), if she can walk infinitely far from the starting point. Otherwise, print "No" (without the quotes).

Sample Input

5 4
##.#
##S#
#..#
#.##
#..#
5 4
##.#
##S#
#..#
..#.
#.##

Sample Output

Yes
No

Hint

Multiple test cases.


好吧,一开始的想法是拓展成一个九宫格,然后看看从中间的S点能不能跑到别的格子里的S点上去,但是这样做不行的。。

因为可能会存在要绕很多的格子,最后回到一个S的情况,换一句话说,仅仅考虑9宫格是不够的。

因此 ,我们考虑不完全的把地图生成出来,仅仅在一张n×m的地图上面跑,BFS的时候队列的里面的每一个点的坐标是真实的坐标,但是在判断的时候转化为在图上的坐标去判断。

对于当前的点p,假设我们可以拓展到点q,并且q还没有被访问过,那么就把q打上 一个vis标记,并且记录一下q当前的真实坐标

若可以拓展到q且q已经被访问过了,则判断q的真实坐标和当前走到q的坐标是不是一样的,假若真实坐标不一样,则代表存在一条路径经过一些地图块后依然可以走到q点,那么此时就代表可以走到无限远处

假若真实坐标是一样的,则什么事也没有发生

只要想清楚了,代码还是不难的

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;
const int maxm=1510,dx[]{0,0,1,-1},dy[]{1,-1,0,0};
typedef pair<int,int> pa;

queue<pa> q;
int n,m;
char board[maxm][maxm];
bool vis[maxm][maxm],bfs();
pa rec[maxm][maxm],s;

int main(){
    ios_base::sync_with_stdio(0);
    while(cin>>n>>m){
        for(int i=0;i<n;++i)
        for(int j=0;j<m;++j){
            cin>>board[i][j];
            if(board[i][j]=='S')
                board[i][j]='.',s=make_pair(i,j);
        }

        cout<<(bfs()?"Yes\n":"No\n");
        memset(vis,0,sizeof(vis[0])*n);
    }
    return 0;
}

bool bfs(){
    while(!q.empty())q.pop();
    q.push(s);
    vis[s.first][s.second]=true;
    rec[s.first][s.second]=s;
    int tmp_x,tmp_y;
    while(!q.empty()){
        s=q.front();q.pop();
        for(int i=0;i<4;++i){
            tmp_x=((s.first+dx[i])%n+n)%n,tmp_y=((s.second+dy[i])%m+m)%m;
            if(board[tmp_x][tmp_y]!='#')
            if(!vis[tmp_x][tmp_y])
                vis[tmp_x][tmp_y]=true,q.push(rec[tmp_x][tmp_y]=make_pair(s.first+dx[i],s.second+dy[i]));
            else if(rec[tmp_x][tmp_y]!=make_pair(s.first+dx[i],s.second+dy[i]))
                return true;
        }
    }
    return false;
}



猜你喜欢

转载自blog.csdn.net/Good_night_Sion_/article/details/72795474
end