zoukankan      html  css  js  c++  java
  • 洛谷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  } 
  • 相关阅读:
    Hack The Box——Traverxec
    Hack The Box——AI
    Hack The Box——Json
    BZOJ1036 树的统计Count
    BZOJ1036 树的统计Count
    BZOJ1036 树的统计Count
    BZOJ1036 树的统计Count
    .net 面试题
    .net 面试题
    .net 面试题
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12416291.html
Copyright © 2011-2022 走看看