luoguP1363 幻想迷宫

Date: Tue 30 October 2018
Updated: Tue 30 October 2018

In 5. OI.

Tags: OI

题目


#include<bits/stdc++.h>
#define N 1600
#define INF 99999999
#define md(a,b) (((a)%b+b)%b)
#define fsb(a,b,c) for(int a=b;a<=c;a++)
#define fbs(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
int sx,sy,n,m,a[N][N],flag;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
struct node{
 int x,y; 
}vis[N][N];
char s[N];
inline void dfs(int x,int y,int xx,int yy){
// printf("%10d %d %d %d\n",x,y,xx,yy);
 if(vis[xx][yy].x<INF){
  if(vis[xx][yy].x!=x||vis[xx][yy].y!=y)flag=1;
  return;
 }
 vis[xx][yy]=(node){x,y};
 fsb(i,0,3)
  if(a[md(x+dx[i],n)][md(y+dy[i],m)]==1){
   dfs(x+dx[i],y+dy[i],md(x+dx[i],n),md(y+dy[i],m));
   if(flag==1)return;
  }
}
int main(){
 while(~scanf("%d%d",&n,&m)){
  fsb(i,0,n-1){
   scanf("%s",s);
   fsb(j,0,m-1){
    a[i][j]=s[j]=='#'?0:1; 
    if(s[j]=='S')sx=i,sy=j;
   }
  }
//  fsb(i,1,n){
//   fsb(j,1,m)printf("%d",a[i][j]);puts("");
//  }
  memset(vis,127,sizeof(vis));flag=0;
  dfs(sx,sy,sx,sy);
  puts(flag==1?"Yes":"No");
 }
 return 0;
}

Social