BFS基礎例題

2021-09-26 01:43:46 字數 3905 閱讀 8430

都是kuangbin的題

例1 poj2251 dungeon master

三維迷宮問題

題目大意:在三維空間中給出起點和終點,找最短的逃出去的路徑長

做法:bfs基礎上增加一維,本質是一樣的

const

int maxn=

2e6+7;

const

int inf=

1e9;

const ll inff=

1e18

;int way[6]

[3]=

,,,,

,};struct nodep[

30000

],sx,n1,n2;

char s[40]

[40][

40];int flag[40]

[40][

40],h3,h2,x3,x2,y3,y2,x,y,h,ans;

bool mark;

void

bfs(

int h,

int x,

int y,

int step)

for(

int i=

0;i<

6;i++)}

return;}

intmain()

if(s[i]

[j][k]

=='e'

)//終點}}

}bfs

(h3,x3,y3,0)

;if(mark)

printf

("escaped in %d minute(s).\n"

,ans)

;else cout<<

<}}

例2 find a way hdu2612

大致題意:有兩個人,要到乙個地方碰面,求兩人走的路徑和最小是多少

做法:本質和乙個人走去乙個地方是一樣的,多了乙個人,那就bfs兩次,記錄一下就可以了

const

int maxn=

2e2+7;

const

int inf=

1e9;

const ll inff=

1e18

;struct node

sx,n1,n2,n3,n4;

char s[maxn]

[maxn]

;int flag[maxn]

[maxn]

;int n,m,a1,a2,b1,b2;

int d1[maxn]

[maxn]

;int d2[maxn]

[maxn]

;int way[4]

[2]=

,,,}

;void

bfs1()

sx.x=a1;

sx.y=b1;

sx.step=0;

q.push

(sx)

; flag[a1]

[b1]=1

;while

(!q.

empty()

)for

(int i=

0; i<

4; i++)}

}mem

(flag)

; sx.x=a2;

sx.y=b2;

sx.step=0;

q.push

(sx)

; flag[a2]

[b2]=1

;while

(!q.

empty()

)for

(int i=

0; i<

4; i++)}

}}intmain()

if(s[i]

[j]==

'm')}}

bfs1()

;for

(int i=

0; i)else

ans=

min(ans,d1[i]

[j]+d2[i]

[j]);}

} cout<11<}return0;

}

例3: hdu 2717 catch that cow

大致題意:在一維x座標軸上,從n走到k的最短運算元量

操作1:x+1或x-1

操作2:x×2

做法:與二維類似,思路要比二維稍複雜一些,畢竟多了個操作2

const

int maxn=

2e5+7;

const

int inf=

1e9;

const ll inff=

1e18

;int flag[maxn]

;struct node

sx,n1,n2;

int n,ex;

queue q;

void

bfs(

int n)

sx.x=n;

sx.step=0;

q.push

(sx)

; flag[sx.x]=1

;while

(!q.

empty()

) q.

push

(n2);}

}return;}

intmain()

}

例4: hdu1495 非常可樂

題意:給你三個瓶子的容量s,n,m 滿足s=m+n ,但是這三個瓶子都沒有刻度,問最少幾步能平分s毫公升的液體或不能。

做法:一共有六種狀態,分別列舉+bfs 注意細節,這麼寫min好像是最簡潔的了

const

int maxn=

2e6+7;

const

int inf=

1e9;

const ll inff=

1e18

;int s,x,y,n,m;

struct node

sx1,n1,n2,sx2;

int flag[

102]

[102][

102]

,ans;

void

bfs(

int a,

int b,

int c,

int step)

for(

int i=

0; i<

6; i++

)else

if(i==1)

else

if(i==2)

else

if(i==3)

else

if(i==4)

else

if(i==5)

if(n2.a>s||n2.a<

0||n2.b>x||n2.b<

0||n2.c<

0||n2.c>y)

continue;if

(flag[n2.a]

[n2.b]

[n2.c]==1

)continue

; flag[n2.a]

[n2.b]

[n2.c]=1

; n2.step=n1.step+1;

q.push

(n2);}

}}intmain()

mem(flag)

; ans=inf;

x=min(n,m)

; y=

max(n,m)

;bfs

(s,0,0

,1);

if(ans==inf)

cout<<

"no"

cout<}}

BFS例題 A計畫

c ontr ibcontrib a11y accessibility menu.js 關於 bfs要點 1 若為可化為的座標系圖形,可用結構體儲存其x值,y值和步數。一般開now 和 next now用於取出佇列裡面的結構體 next用於上下左右的運動計算,並且push到佇列中。2 在運用佇列時,...

BFS和佇列例題

poj2251dungeon master 最簡單的bfs求最短距離,只是改一下方向陣列就可以,二維陣列改為三維陣列 下面是ac 對了,下面用的c 佇列,其實很簡單,就只有幾種操作 先介紹佇列的定義 queue 型別名 變數名,如 queueq,queue或queueque struct node ...

bfs例題 血色先鋒軍

巫妖王的天災軍團終於捲土重來,血色十字軍組織了一支先鋒軍前往諾森德大陸對抗天災軍團,以及一切沾有亡靈氣息的生物。孤立於聯盟和部落的血色先鋒軍很快就遭到了天災軍團的重重包圍,現在他們將主力只好聚集了起來,以抵抗天災軍團的圍剿。可怕的是,他們之中有人感染上了亡靈瘟疫,如果不設法阻止瘟疫的擴散,很快就會遭...