【Luogu1363】幻想迷宫

problem

solution

codes

//语文题,这很好  last submit
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 3100;
int n, m, a[maxn][maxn], vis[maxn][maxn], x, y, flag;
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};
void dfs(int x, int y){
    if(flag||x<0||x>=2*n||y<0||y>=2*m||a[x][y]||vis[x][y])return ;
    if(x>=n||y>=m)
        if(vis[x%n][y%m]||vis[x%n+n][y%m]||vis[x%n][y%m+m]||vis[x%n+n][y%m+m]){flag=1;return ;}
    vis[x][y] = 1;
    for(int i = 0; i < 4; i++)
        dfs((x+dx[i]+2*n)%(2*n),(y+dy[i]+2*m)%(2*m));
}
int main(){
    ios::sync_with_stdio(false);
    while(cin>>n>>m){
        flag = 0;
        memset(a,0,sizeof(a));
        memset(vis,0,sizeof(vis));//bugs
        //date in
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                char ch;  cin>>ch;
                if(ch == '#')a[i][j]=1;
                if(ch == 'S')x=i,y=j;
            }
        }
        //copy for 3
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                a[i][j+m] = a[i][j],
                a[i+n][j] = a[i][j],
                a[i+n][j+m] = a[i][j];
        //search
        dfs(x,y);
        if(flag)cout<<"Yes
";
        else cout<<"No
";
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gwj1314/p/9444717.html