幻想迷宫
題目描述
背景 Background
(喵星人LHX和WD同心協力擊退了汪星人的入侵,不幸的是,汪星人撤退之前給它們制造了一片幻象迷宮。)
WD:嗚嗚,腫么辦啊……
LHX:momo...我們一定能走出去的!
WD:嗯,+U+U!
描述 Description
幻象迷宮可以認為是無限大的,不過它由若干個N*M的矩陣重復組成。矩陣中有的地方是道路,用'.'表示;有的地方是墻,用'#'表示。LHX和WD所在的位置用'S'表示。也就是對于迷宮中的一個點(x,y),如果(x mod n,y mod m)是'.'或者'S',那么這個地方是道路;如果(x mod n,y mod m)是'#',那么這個地方是墻。LHX和WD可以向上下左右四個方向移動,當然不能移動到墻上。
請你告訴LHX和WD,它們能否走出幻象迷宮(如果它們能走到距離起點無限遠處,就認為能走出去)。如果不能的話,LHX就只好啟動城堡的毀滅程序了……當然不到萬不得已,他不想這么做。。。
輸入輸出格式
輸入格式:
?
輸入格式 InputFormat
輸入包含多組數據,以EOF結尾。
每組數據的第一行是兩個整數N、M。
接下來是一個N*M的字符矩陣,表示迷宮里(0,0)到(n-1,m-1)這個矩陣單元。
?
輸出格式:
?
輸出格式 OutputFormat
對于每組數據,輸出一個字符串,Yes或者No。
?
輸入輸出樣例
輸入樣例#1:?復制 5 4 ##.# ##S# #..# #.## #..# 5 4 ##.# ##S# #..# ..#. #.## 輸出樣例#1:?復制 Yes No說明
數據范圍和注釋 Hint
對于30%的數據,N,M<=20
對于50%的數據,N.M<=100.
對于100%的數據,N,M<=1500,每個測試點不超過10組數據.
?
?
【題解】對于整個迷宮,如果能無限走可想而知左邊就是相對于中間是負的超出n,m如圖,所以我們只要記錄下訪問時候的絕對坐標,然后轉換成相對坐標即可。
#include<cstdio> #include<cstring> char s[1510][1510]; int dx[]= {-1,0,1,0},dy[]= {0,1,0,-1}; int n,m,sx,sy; bool v[1510][1510]; struct T {int x,y; } a[1510][1510]; bool dfs(int x,int y) {int px=(x%n+n)%n,py=(y%m+m)%m;if(s[px][py]=='#')return false;T &p=a[px][py];if(v[px][py])return p.x!=x||p.y!=y;v[px][py]=true;p.x=x,p.y=y;for(int i=0; i<4; i++)if(dfs(x+dx[i],y+dy[i]))return true;return false; } int main() {while(~scanf("%d%d",&n,&m)) {memset(v,0,sizeof(v));memset(a,0,sizeof(a));for(int i=0; i<n; i++) {scanf("%s",s[i]);for(int j=0; j<m; j++)if(s[i][j]=='S') {sx=i,sy=j;s[sx][sy]='.';}}if(dfs(sx,sy))puts("Yes");else puts("No");}return 0; }?
轉載于:https://www.cnblogs.com/kcfzyhq/p/8543171.html
總結
- 上一篇: 微软一站式示例代码库 2012 年2月示
- 下一篇: 仔细讨论 C/C++ 字节对齐问题⭐⭐