1. 程式人生 > >幻想迷宮(或無限迷宮)——因為邏輯不清而做不出的典型

幻想迷宮(或無限迷宮)——因為邏輯不清而做不出的典型

open while closed div set sta click memset tdi

  我是復制了三塊原矩陣。開始時復制了四個,一個方向一個,過了樣例但四十分。後來調來調去,判斷能否脫出的條件也換了又換,終於……

技術分享
 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

幻想迷宮(或無限迷宮)——因為邏輯不清而做不出的典型