洛谷1363 幻象迷宫dfs

题目网址:https://www.luogu.com.cn/problem/P1363

迷宫是无限多块地图拼接而成的,问是否可以在迷宫中走无限远。解决方案是dfs,走出初始地图之后的位置映射到原位置(取模),如果同一个映射位置两次经过的坐标不一样,则表示这个位置可以无限多次经过,就走不出迷宫。

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int ui;
 4 typedef long long ll;
 5 typedef unsigned long long ull;
 6 #define pf printf
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define prime1 1e9+7
 9 #define prime2 1e9+9
10 #define scand(x) scanf("%llf",&x) 
11 #define f(i,a,b) for(int i=a;i<=b;i++)
12 #define scan(a) scanf("%d",&a)
13 #define dbg(args) cout<<#args<<":"<<args<<endl;
14 #define pb(i) push_back(i)
15 #define ppb(x) pop_back(x)
16 #define inf 0x3f3f3f3f
17 #define maxn 1505
18 int n,m,t,sx,sy;
19 bool flag=false;
20 char Map[maxn][maxn];
21 int vis[maxn][maxn][3];//第一维存放是否访问过,第二、三维存放第一次 访问的横纵坐标 
22 int dir[][2]={{0,1},{0,-1},{-1,0},{1,0}};
23 void dfs(int mx,int my,int x,int y,int dep)
24 {
25     if(flag)return;
26 //    pf("%d:%d %d
",dep,x,y);
27     if(vis[mx][my][0]&&(vis[mx][my][1]!=x||vis[mx][my][2]!=y))//从(x,y)位置会到达像(x,y+/-m)这样的位置,所以只有一个坐标不同 
28     {//表明映射坐标是第二次到达,可以到达两次则可以到达无穷次 
29         flag=true;
30         return;
31     }
32     //如果已经标志第一次经过该点搜索失败,则下一次从这个点开始深搜同样会失败,跳过 
33     if(vis[mx][my][0]&&vis[mx][my][1]==x&&vis[mx][my][2]==y)return;
34     
35     vis[mx][my][0]=1;//第一次访问,设置第一次访问的坐标信息 
36     vis[mx][my][1]=x;
37     vis[mx][my][2]=y;
38     int xx,yy,modx,mody;
39     f(i,0,3)
40     {
41         xx=x+dir[i][0];
42         yy=y+dir[i][1];
43         
44          modx=(xx+(n*2))%n;//正向取模,防止模数非正 
45          mody=(yy+(m*2))%m;
46         if(Map[modx][mody])
47         {
48             dfs(modx,mody,xx,yy,++dep);
49         }
50     }
51 }
52 char c;
53 int main()
54 {
55     //freopen("input.txt","r",stdin);
56     //freopen("output.txt","w",stdout);
57     std::ios::sync_with_stdio(false);
58     while(scanf("%d%d",&n,&m)!=EOF)
59     {
60         mem(Map,0);
61         f(i,0,n-1)
62         {
63             f(j,0,m-1)
64             {
65                 scanf(" %c",&c);
66                 if(c=='.')Map[i][j]=1;
67                 if(c=='S')
68                 {
69                     Map[i][j]=1;
70                     sx=i;
71                     sy=j;
72                 }
73             }
74             
75         }
76         flag=false;
77         mem(vis,0);
78         dfs(sx,sy,sx,sy,0);
79         if(flag)pf("Yes
");
80         else pf("No
");
81     }
82     
83  } 
原文地址:https://www.cnblogs.com/randy-lo/p/12416291.html