#include#include洛谷p1363#include
using
namespace
std;
#define abss(i) -(i)
#define check(a) ((a) == 's' || (a) == '.')
#define checkj (j[0] || j[1])queue
que;
struct
node
lst[6060],arc[50];//
posint head[6060];//
no-cross adt adt nb
char s[1505][1505
];int vis[6006],vis1[5
];int
n, m, st, cnt;
int dx[4] = ;
int dy[4] = ;
int j[2
];int vis2[60006
];int check1(int x, int
y)
return
flag;
}return0;
}int check2(int x, int
y)
return0;
}void build_poi(int x, int y, int rt)//
dfs **建點 設定連通塊的邊(建的點與對應點即為一條邊)
else
if(check2(x, y))
if(s[x][y] == '
s')
s[x][y] = 'b'
;
for(int i = 0; i < 4; i++)
}int jmp(int a)//
該函式等價於 v = e[pos].v
void jmp1(int now, int i, int dt)//
追蹤當前dfs跳了哪些邊
if(now <= n - 2) j[0] +=dt;
else
if(now <= n*2 - 4) j[0] -=dt;
else
if(now <= n*2 - 4 + m-2) j[1] +=dt;
else j[1] -=dt;
}int findd(int pos, int
rt)//
設定vis2,及時入隊
vis[rt] = 1
;
if(rt == st) return
1;//
同第一行,及時處理
int now =head[rt];
while
(now)
if(tar != pos && !vis[rt] && findd(pos, rt)) return1;
if(rt == st && tar != pos && checkj) return1;
jmp1(now ,
0, -1
); }
else
if(!vis[arc[i].rt] && findd(pos,arc[i].rt)) return1;
if(arc[i].rt == st && checkj) return1;
jmp1(now, i, -1
); }}}
now = now>0?lst[now].to:arc[abss(now+1
)].to;
}return0;
}/*該題需要測試 s點能訪問到的的所有連通塊能否訪問自身
*/int
dfs()
else}}
pos = pos>0?lst[pos].to:arc[abss(pos+1
)].to;}}
return0;
}int
main()
for(int i = 1; i <= n; i++) s[i][m+1] = '#'
;
for(int i = 1; i <= m; i++) s[n+1][i] = '#'
; st = cnt = 0
;
//build point
//存在對點的點 記錄至head
for(int i = 1; i <= n; i++)
for(int i = 1; i <= m; i++)
while(!que.empty()) que.pop();
que.push(st);
if(st && dfs()) puts("
yes");//
else puts("no"
);
for(int i = 1; i <= cnt; i++) head[i] = 0
;
for(int i = 0; i < 5; i++) arc[i].rt = arc[i].to = 0
; }
return0;
}/*將二維的圖壓成一維
此題只有能跳邊的點才可能有效,在遍歷的時候只需要考慮邊界上&&能跳邊的點。
不同的連通塊之間用邊界上的點連線(只有這一種方式)
#..##
##s##
#####
.....
#.###
只有(1,2)(5,2) 和 (4,1)(4,5)兩個點值得記錄,因為它們能通向別的區域,並且存在繞回來的可能性。
使用hash對映,將二維的點壓成1維。
-0 07 08 09 10 -1
01 04
02 05
03 06
-2 11 12 13 14 -3
左右邊上的點滿足 (y==1||y==m)&&(1x|v
將其整體逆時針旋轉90°即可恢復為常見的座標系。
為了區分,將四角的點對映為負值 -1 -2 -3 -4
pos = abss(now) - 1;
還原用 now = abss(pos+1);
可能跳的邊為
for(int i = 0; i < 3; i++)
滿足條件的 i 和 pos 能跳
*/
此寫法雖然**量大,執行時間長,但是可以用來演隊友。
1 #include2正常寫法3char s[1505][1505];4
int vx[1505][1505],vy[1505][1505];5
intn, m;
6int dx[4] = ;
7int dy[4] = ;
8const
int inf = 0x3f3f3f3f;9
10int dfs(int sx, int
sy)11
2021
intmain()
2237}38
}3940}
41return0;
42 }
記錄第一次到達某點的座標,以後遍歷和第一次對比。
注意要沿著原路徑走,否則都是yes。
洛谷P1363 幻想迷宮
背景 background 喵星人lhx和wd同心協力擊退了汪星人的入侵,不幸的是,汪星人撤退之前給它們製造了一片幻象迷宮。wd 嗚嗚,腫麼辦啊 lhx momo.我們一定能走出去的!wd 嗯,u u!描述 description 幻象迷宮可以認為是無限大的,不過它由若干個n m的矩陣重複組成。矩陣...
洛谷P1363 幻想迷宮
背景 background 喵星人lhx和wd同心協力擊退了汪星人的入侵,不幸的是,汪星人撤退之前給它們製造了一片幻象迷宮。wd 嗚嗚,腫麼辦啊 lhx momo 我們一定能走出去的!wd 嗯,u u!描述 description 幻象迷宮可以認為是無限大的,不過它由若干個n m的矩陣重複組成。矩陣...
洛谷 P1363 幻想迷宮
背景 background 喵星人lhx和wd同心協力擊退了汪星人的入侵,不幸的是,汪星人撤退之前給它們製造了一片幻象迷宮。wd 嗚嗚,腫麼辦啊 lhx momo.我們一定能走出去的!wd 嗯,u u!描述 description 幻象迷宮可以認為是無限大的,不過它由若干個n m的矩陣重複組成。矩陣...