P1363 幻象迷宫
传送门
思路
核心思想是当走到一个曾经到过并且不在同一矩阵中的点,则可以走出迷宫。细节处理上要注意对比实际点和虚拟点时不需要两个坐标都相等,可能出现在两个矩阵中但是x轴或者y轴相等。
代码
#include
#include
using namespace std;
int vis[1510][1510][3], N, M;
char Gap[1510][1510]; bool ans;
int dx[5] = { 233,1,-1,0,0 };
int dy[5] = { 322,0,0,1,-1 };
void DFS(int Vx, int Vy, int Rx, int Ry)
{
if (ans || Gap[Vx][Vy] != '.')return;
if (vis[Vx][Vy][0]) {
if (vis[Vx][Vy][1] != Rx || vis[Vx][Vy][2] != Ry)
ans = true;
return;
}
vis[Vx][Vy][0] = 1;
vis[Vx][Vy][1] = Rx, vis[Vx][Vy][2] = Ry;
for (int i = 1; i <= 4; i++)
DFS((Vx + dx[i] + N) % N, (Vy + dy[i] + M) % M, Rx + dx[i], Ry + dy[i]);
}
int main(void)
{
while (cin >> N >> M) {
for (int i = 0; i < N; i++)
cin >> Gap[i];
int xpos = 0, ypos = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (Gap[i][j] == 'S')
xpos = i, ypos = j, Gap[i][j] = '.';
DFS(xpos, ypos, xpos, ypos);
if (ans)cout << "Yes" << endl;
else cout << "No" << endl;
memset(vis, 0, sizeof(vis));
memset(Gap, 0, sizeof(Gap));
ans = false;
}
return 0;
}