luoguP1363 幻想迷宫

题目


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}