關於 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
1sample output5 5 14
s*#*.
.#...
.....
****.
...#.
..*.p
#.*..
***..
...*.
*.#..
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...