luogu p1363 幻象迷宮

2021-10-19 04:20:03 字數 1793 閱讀 1263

傳送門

(喵星人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就只好啟動城堡的毀滅程式了......當然不到萬不得已,他不想這麼做。。。

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

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

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

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

5 4

##.#

##s#

#..#

#.##

#..#

5 4##.#

##s#

#..#

..#.

#.##

yes

no

對於30%的資料,n,m<=20

對於50%的資料,n.m<=100.

對於100%的資料,n,m<=1500,每個測試點不超過10組資料.

本題思路:將地圖拓展,記錄對於乙個單位地圖的相對位置x, y和記錄整個拓展地圖的絕對位置ux,uy。

顯然如果第一次走過這個位置,x = ux且y = uy,那麼如果x != ux 或者 y != uy,說明當前點被走了第二遍,那麼這就意味著可以無限走下去。

最近備考,沒時間寫詳細題解了,寫個大概思路就行了。

/*

* @author: crab-in-the-northeast

* @date: 2020-09-26 21:03:11

* @last modified by: crab-in-the-northeast

* @last modified time: 2020-09-30 18:59:31

*/#include #include #include const int maxn = 1505;

const int dx = ;

const int dy = ;

char a[maxn][maxn];

bool vis[maxn][maxn];

int visu[maxn][maxn][2];

bool fnd;

int n, m;

void dfs(int x, int y, int ux, int uy)

vis[x][y] = true;

visu[x][y][0] = ux;

visu[x][y][1] = uy;

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

}int main()

}dfs(sx, sy, sx, sy);

std :: printf("%s\n", fnd ? "yes" : "no");

}return 0;

}

評測記錄

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 而...

洛谷P1363 幻象迷宮

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