BFS的乙個題

2021-08-15 22:41:21 字數 2811 閱讀 8884

關於 bfs要點:

1、若為可化為的座標系圖形,可用結構體儲存其x值,y值和步數。(一般開now 和 next ,now用於取出佇列裡面的結構體)next用於上下左右的運動計算,並且push到佇列中。

2、在運用佇列時,常用的函式(push,front,size,empty,pop 等等),特別是在front佇列裡面的結構體時記住pop,佇列裡面的內容是先存放先使用,有序取出。

3、在壓入點到佇列中時要進行判斷是否合理,可寫乙個函式check進行判斷,判斷依據是否出界,以及是否合題意要求。

4、題目a計畫中的」傳送門「並不會影響step,在判斷過於複雜時可以寫函式以免混淆思維。在關鍵點可以用陣列進行記錄,開陣列時可以根據題意開大10%的陣列(題意:a<=100  可開a[110])。

5、在移動壓縮時,可根據題意開乙個二維陣列進行前後左右的移動,移動時一般使用next結構體。

bfs例題:

a計畫可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在t時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士lj肯定能將她救出。

現據密探所報,公主被關在乙個兩層的迷宮裡,迷宮的入口是s(0,0,0),公主的位置用p表示,時空傳輸機用#表示,牆用*表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是牆的話,那騎士們就會被撞死。騎士們在一層中只能前後左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。

input輸入的第一行c表示共有c個測試資料,每個測試資料的前一行有三個整數n,m,t。 n,m迷宮的大小n*m(1 <= n,m <=10)。t如上所意。接下去的前n*m表示迷宮的第一層的布置情況,後n*m表示迷宮第二層的布置情況。output如果騎士們能夠在t時刻能找到公主就輸出「yes」,否則輸出「no」。sample input

1

5 5 14

s*#*.

.#...

.....

****.

...#.

..*.p

#.*..

***..

...*.

*.#..

sample output
yes

#include #include #include using namespace std;

struct node

;int t,n,m,lim;

int s[3],e[3];

int to[4][2] = ;

char map[2][15][15];

int use[2][15][15];

int check(int floor,int x,int y)

void bfs()

if(a.step>=lim)

break;

for(i = 0; i<4; i++)

if(next.floor == e[0] && next.x == e[1] && next.y == e[2])

q.push(next);}}

printf("no\n");

}int main()

;char map[15][15][5];

int mark[15][15][5];

int n,m,t,flag;

int dx,dy,dz;

int vis[4][2]=;

int ok(int x,int y,int z)

void bfs()

for(int i=0;i<=3;i++)

else

p.z=q.z;

p.t=q.t+1;

que.push(p);}}

}}int main()

getchar();

}getchar();

}for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

memset(mark,0,sizeof(mark));

mark[1][1][1]=1;

bfs();

if(flag)

printf("yes\n");

else

printf("no\n");

}}

只需要注意雙層之間傳遞的問題

如果『#』的下一層是『』那麼這一層的『#』也將變為『 * 』

額外注意的一點就是關於兩層的表示問題

如果一層是 ff 另一層就是 ff ^ 1;

#include #include #includeusing namespace std ;

typedef struct ll ;

int n,m,t ;

char map[2][11][11] ;

int vis[2][11][11] ;

int dir[4][2]=,,,} ;// 四個移動方向

int flag ;

void bfs()

if(map[now.f][now.x][now.y]=='p')//如果找到但是不是最大值 直接返回 無要求解(bfs預設為最小)

for(int i=0;i<4;i++)

if(!vis[ff][xx][yy] && map[ff][xx][yy]!='#')}}

}int main(void)

bfs() ;

if(flag)

puts("yes") ;

else

puts("no") ;

}return 0 ;

}

乙個簡單的題

problem description 小明今年3歲了,現在他已經能夠認識100以內的非負整數,並且能夠進行100以內的非負整數的加法計算.對於大於等於100的整數,小明僅保留該數的最後兩位進行計算,如果計算結果大於等於100,那麼小明也僅保留計算結果的最後兩位.例如,對於小明來說 1 1234和3...

乙個演算法題

題目描述 某省會城市街道縱橫交錯,為了監控路燈的執行狀況,每條街道使用乙個數字字串標識該街道上所有路燈的執行狀況。假設路燈只有如下 3種狀態 分別用數字 0,1,2標識,一盞路燈只對應其中一種狀態 0 標識路燈熄滅 1 標識路燈開啟 2 標識路燈故障 請根據輸入的字串,找出該街道上連續的處於相同狀態...

乙個精度題。。。

首先肯定想到二分。然而j精度問題。那就看你自己的造化了。二分得出乙個每個人的 步長 然後再列舉 來一次二分就可以了 其實直接算就好了 include include include include include include include include include include inc...