洛谷P1363花裡胡哨寫法

2022-05-24 23:33:10 字數 3610 閱讀 6031

#include#include

#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 能跳

*/

洛谷p1363

此寫法雖然**量大,執行時間長,但是可以用來演隊友。

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的矩陣重複組成。矩陣...