题目:http://codeforces.com/contest/197/problem/D
题意:在迷宫找一条可以循环的路,上下可以连接起来
分析:像一种贪吃蛇游戏,贪吃蛇可以从下面出去,从上面出来。。。找一条使得贪吃蛇不死亡的走法。若找得到输出Yes,否输出No
#include <bits/stdc++.h>
using namespace std;
int n,m,S[2];
int num[1505][1505][2];
bool s[1505][1505];
int p[4][2] = {0,-1,1,0,0,1,-1,0};
void dfs(int x,int y)
{
if(num[x%n][y%m][0] == -1 && num[x%n][y%m][1] == -1)
{
num[x%n][y%m][0] = x;num[x%n][y%m][1] = y;
}
else if(num[x%n][y%m][0] != x || num[x%n][y%m][1] != y)//此为或。。。检查了老久才发现
{
printf("Yes\n");
exit(0);
}
else
return ;
//printf("x = %d y = %d\n",x,y);
for(int i=0;i<4;i++)
{
if(s[(x+p[i][0])%n][(y+p[i][1])%m])
dfs(x+p[i][0],y+p[i][1]);
}
}
int main()
{
scanf("%d %d",&n,&m);
char ch;
getchar();
for(int i=0;i<n;i++)
{
for(int j =0;j<m;j++)
{
ch = getchar();
if(ch == '.')
s[i][j] = true;
if(ch == 'S')
{
s[i][j] = true;
S[0] = i+n*m;//防止取模出现负值
S[1] = j+n*m;
}
}
getchar();
}
memset(num,-1,sizeof(num));dfs(S[0],S[1]);
//5 memset(num,false,sizeof(num));bfs(S[0],S[1]);
printf("No\n");
return 0;
}