幻想迷宫(或无限迷宫)——因为逻辑不清而做不出的典型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了幻想迷宫(或无限迷宫)——因为逻辑不清而做不出的典型相关的知识,希望对你有一定的参考价值。

  我是复制了三块原矩阵。开始时复制了四个,一个方向一个,过了样例但四十分。后来调来调去,判断能否脱出的条件也换了又换,终于……

技术分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<stack>
 9 #include<queue>
10 #include<cmath>
11 #include<map>
12 #include<set>
13 using namespace std;
14 const int N=3012,ax[]={1,-1,0,0},ay[]={0,0,1,-1};
15 struct node{int x,y;};
16 int n,m,sx,sy;
17 bool gr[N][N],res;
18 void dfs(int x,int y){
19     if(res)return;
20     if(x<0||y<0||x>2*n||y>2*m)return;
21     if(gr[x][y]&&!(x==sx&&y==sy))return;
22     if((x%n)==(sx%n)&&(y%m)==(sy%m)&&!(x==sx&&y==sy)){
23         res=true;
24         gr[x][y]=true;
25         return;
26     }
27     gr[x][y]=true;
28     if(gr[(x+1+2*n)%(2*n)][y]==0)dfs((x+1+2*n)%(2*n),y);
29     if(gr[(x-1+2*n)%(2*n)][y]==0)dfs((x-1+2*n)%(2*n),y);
30     if(gr[x][(y-1+2*m)%(2*m)]==0)dfs(x,(y-1+2*m)%(2*m));
31     if(gr[x][(y+1+2*m)%(2*m)]==0)dfs(x,(y+1+2*m)%(2*m));
32 }
33 int main(){
34     while(cin>>n>>m){
35         sx=1,sy=1;
36         res=false;
37         memset(gr,0,sizeof gr);
38         string s[N];
39         for(int i=0;i<n;i++)cin>>s[i];
40         for(int i=0;i<n;i++)
41             for(int j=0;j<m;j++){
42                 if(s[i][j]==#)gr[i][j]=true;
43                 else if(s[i][j]==S)sx=i,sy=j;
44             }
45         for(int i=0;i<n;i++)
46             for(int j=0;j<m;j++)
47                 gr[i+n][j]=gr[i][j+m]=gr[i+n][j+m]=gr[i][j];
48         gr[sx][sy]=true;
49         dfs(sx,sy);
50         cout<<(res?"Yes":"No")<<endl;
51     }
52     return 0;
53 }
Method_01

  洛谷 Yukikaze 988ms

以上是关于幻想迷宫(或无限迷宫)——因为逻辑不清而做不出的典型的主要内容,如果未能解决你的问题,请参考以下文章

P1363 幻想迷宫

[P1363] 幻想迷宫

洛谷搜索(dfs)P1363 幻想迷宫

luogu_1363 幻想迷宫

迷宫求解程序的回溯逻辑错误

SDOI2012 走迷宫