洛谷 P1363 幻象迷宫(bfs、思维)

题目来源:https://www.luogu.com.cn/problem/P1363
答案导航:https://www.luogu.com.cn/record/232043052

一道简单的图论(误)?搜索(正确),挂的标签是dfs但是其实bfs好用很多,
*思路:因为这题中理论上是个无限延展的图,实际上做不出来无限,所以先考虑模拟。用点的坐标取模来模拟当前走到了第几张图(或者说上下左右哪一方位的哪一张图)

bool dfs(int sx, int sy) { queue<PII>q; q.push({ sx,sy }); havego[sx][sy] = { (sx + 2 * N) / N,(sy + 2 * M) / M }; while (!q.empty()) { int ux = q.front().first; int uy = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int nx = ux + dx[i] + 2 * N; int ny = uy + dy[i] + 2 * M; PII ntu; ntu.first = nx / N; ntu.second = ny / M; //通过点的坐标来确定当前是第几张图,如原初图的ntu就应该是(2,2),因为我加了2*N和2*M来防负数 int lnx = nx % N; int lny = ny % M; //起到了把点映射回到原初图的作用 if (mp[lnx][lny]) { if (havego[lnx][lny] != ntu && havego[lnx][lny].first != -1 && havego[lnx][lny].second != -1) { return 1; } else if (havego[lnx][lny].first == -1 && havego[lnx][lny].second == -1) { q.push({ nx - 2 * N,ny - 2 * M }); havego[lnx][lny] = ntu; } } } } return 0; }
坑点比较多(难道是为此而成为绿题的吗),就是在于处理点的位置的时候。
我们用到:int nx = ux + dx[i] + 2 * N;int ny = uy + dy[i] + 2 * M;,因此一张图如果是44,但是却会出现10多的坐标,这个是模拟第几张图的点坐标,但是实际上我开的havego和mp是只有44的,
所以在havego和mp中查找的时候,要把点的坐标映射(注意!)到初始的44图中(尽管你知道它有无限大延伸出去),但是我们空间有限;
然后就是在往q中塞新点的时候,不能直接塞nx,ny, 注意,+2
N和+2M是服务于求图的序号的,让你知道图是第几张,实际上点不应该有这样的增加,所以在q中传递点坐标的时候要把2N和M减回来

posted @ 2025-08-20 10:26  yubai111  阅读(12)  评论(0)    收藏  举报