【dfs】无穷迷宫(jzoj 3924)
生活随笔
收集整理的這篇文章主要介紹了
【dfs】无穷迷宫(jzoj 3924)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
無窮迷宮
jzoj 3924
題目大意
有一個n*m的迷宮,有墻(#),路(.),和你的位置(S),這個迷宮會復制無數份拼在一起,問你能不能不停地走下去
輸入樣例
2 5 4 ##.# ##S# #..# #.## #..# 5 4 ##.# ##S# #..# ..#. #.##輸出樣例
Yes No樣例解釋
第一組測試數據中,機器人不斷沿著路徑向上走即可。
第二組測試數據中,機器人無論向哪個方向走都會是死路。
數據范圍
50% 的數據:1?N,M?50.1 \leqslant N, M \leqslant 50.1?N,M?50.
100% 的數據:1?N,M?1500,1?T?4.1 \leqslant N, M \leqslant 1500,1 \leqslant T \leqslant 4.1?N,M?1500,1?T?4.
解題思路
因為我們不能嘗試不停的走下去,那我們想一下:
如果我們能做到不同迷宮的同一位置,那我們就可以用同樣的方式再走到另一個迷宮的同一位置,那就是可以無限得走下去
那我們dfs時,保存在迷宮內的位置,也要保存對于第一個迷宮的位置,這樣就可以判斷是不是不同迷宮的統一個位置
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int t, n, m, x, y, ans, f[2000][2000][5]; char a[2000][2000]; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, 1, 0, -1}; int sx(int x) {return (x + n - 1) % n + 1; } int sy(int y) {return (y + m - 1) % m + 1; } void dfs(int x, int y, int lx, int ly)//xy是%了的lxly是沒%的 {if (f[x][y][0] && (f[x][y][1] != lx || f[x][y][2] != ly))//之前是否在別的迷宮到過這個位置{ans = 1;return;}f[x][y][0] = 1;f[x][y][1] = lx;f[x][y][2] = ly;for (int i = 0; i < 4 && !ans; ++i)if (a[sx(x + dx[i])][sy(y + dy[i])] != '#' && (!f[sx(x + dx[i])][sy(y + dy[i])][0] || f[sx(x + dx[i])][sy(y + dy[i])][1] != lx + dx[i] || f[sx(x + dx[i])][sy(y + dy[i])][2] != ly + dy[i]))//不是同一個迷宮,或沒到過且不是墻dfs(sx(x + dx[i]), sy(y + dy[i]), lx + dx[i], ly + dy[i]); } int main() {scanf("%d", &t);while(t--){memset(f, 0, sizeof(f));ans = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j){cin>>a[i][j];if (a[i][j] == 'S')x = i, y = j;}dfs(x, y, x, y);if (ans) printf("Yes\n");else printf("No\n");}return 0; }總結
以上是生活随笔為你收集整理的【dfs】无穷迷宫(jzoj 3924)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023新型工业化引领高质量发展研讨会在
- 下一篇: 近似乘积(jzoj 3925)