洛谷P1363幻象迷宮

2022-09-09 22:33:34 字數 1920 閱讀 5233

幻象迷宮可以認為是無限大的,不過它由若干個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就只好啟動城堡的毀滅程式了……當然不到萬不得已,他不想這麼做。。。

輸入描述

輸入包含多組資料,以eof結尾。

每組資料的第一行是兩個整數n、m。

接下來是乙個n*m的字元矩陣,表示迷宮裡(0,0)到(n-1,m-1)這個矩陣單元。

輸出描述

對於每組資料,輸出乙個字串,yes或者no。

原題鏈結

input

5 4

##.#

##s#

#..#

#.##

#..#

5 4##.#

##s#

#..#

..#.

#.##

7 6##.#.#

##.#.#

##.s.#

######

##...#

##.#.#

##.#.#

output

yes

nono

整個迷宮是由 n*m 小迷宮無限擴充套件形成的,想要走到無限遠的地方,那就應該走出很遠後,又能到達某個走過的點(這個走過是指,相對小迷宮的位置已經被走過了)

所以我們就可以沿著這條路徑無限的走下去,注意,如果是小迷宮內部一條路徑自成環的話,沿著環一直走是不可以的。所以我們的任務是,判斷這個點在其它小迷宮裡面是否被走過,怎麼判斷呢,設(x,y)為到達某一點的座標,當(x,y)超出小迷宮的邊界時,我們可以對其取模,我們可以記錄下到達(x,y)時的真實座標(lx,ly)(即不取模的座標),並記錄這(x,y)已經走過,當再次走到(x,y)時,對比此時的真實座標與原來儲存的,只要不相同,則說明我們找到可以無限重複走的路徑,輸出 yes

#include #include #include using namespace std;

const int n = 1510;

const int dx[4] = ,dy[4] = ;

bool map[n][n],flag; // map記錄小迷宮哪些點時可以走的,flag記錄是否找到答案

int n,m,sx,sy,mark[n][n][3];// (sx,sy)為出發點,mark[x][y][0]記錄到達小迷宮中

char c;// (x,y)點時的真實 x 座標,mark[x][y][1],記錄真實 y 座標,mark[x][y][2] 記錄是否走過

void dfs (int x,int y,int lx,int ly)

mark[x][y][0] = lx,mark[x][y][1] = ly,mark[x][y][2] = 1;

for(int i = 0; i < 4; i++)

}}int main()

dfs(sx,sy,sx,sy);

if(flag) puts("yes");

else puts("no");

}return 0;

}

洛谷P1363 幻象迷宮

題意 給出乙個迷宮,判斷能不能走到距離無限遠的地方 分析 本來想複製成3 3的圖然後走的,但是空間有點困難。後面改成了2 2的圖,不過我開了3 3的圖的空間還是過了。解法 dfs include include define re register using namespace std const...

P1363 幻象迷宮

那麼,我們可以很清晰的意識到,如果可以從點 x,y 出發,達到比如 x,y 或者 x,y x,y x m,y n 假設寬m高n 就可以從這個點再次達到相同的點 即可以從 x,y 出發,達到 i,j 且 i n x j m y。一直這麼走下去。那就搜好了。開乙個三維vis陣列第一維記錄有無被訪問,第二...

P1363 幻象迷宮

題意 給你乙個nxm的迷宮g x,y範圍是0 n 1和0 m 1 不能走,可以走,s 作為起點,現在將迷宮擴充套件成無窮大,擴充套件方法是 任意乙個 x,y 位置的字元c g x n,y m 現在問你可不可以從起點處走到無窮遠處。例子 原始迷宮5x5為中間的黃色區域,標紅色的位置的座標為 2,4 而...