那麼,我們可以很清晰的意識到,如果可以從點(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陣列第一維記錄有無被訪問,第二維記錄被訪問時橫座標,第三維縱座標。
判斷重複到達且橫縱座標不同即可。應該注意先判什麼後判什麼。如果是同乙個分矩陣走過去的話自然tx==vis[x][y][0] (此處x為|tx|%n,y為|ty|%m,即對映到中心矩陣的位置),就會被判掉。 而且注意tx!=vis[x][y][0] 和ty!=vis[x][y][1]滿足乙個即可。
沒啥好說的了。。。資料很大注意搜尋優化。
#include
#include
#include
#include
#include
#include
using
namespace std;
bool mapx[
1510][
1510]=
;int vis[
1510][
1510][
3]=;
int m,n,sx,sy,wayx[4]
=,wayy[4]
=,ans=0;
void
dfs(
int x,
int y,
int posx,
int posy)
if(vis[posx]
[posy][2
]&& vis[posx]
[posy][0
]==x && vis[posx]
[posy][1
]==y)
return
; vis[posx]
[posy][0
]=x; vis[posx]
[posy][1
]=y; vis[posx]
[posy][2
]=1;
register
int tox,toy;
for(
int w=
0;w<=
3;w++)}
intmain()
}}dfs(sx,sy,sx,sy);if
(ans)
printf
("yes\n");
else
printf
("no\n");
}return0;
}
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...
洛谷P1363幻象迷宮
幻象迷宮可以認為是無限大的,不過它由若干個n m的矩陣重複組成。矩陣中有的地方是道路,用 表示 有的地方是牆,用 表示。lhx和wd所在的位置用 s 表示。也就是對於迷宮中的乙個點 x,y 如果 x mod n,y mod m 是 或者 s 那麼這個地方是道路 如果 x mod n,y mod m ...