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