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;
}