foj 2150 Fire Games 雙向廣搜

2021-10-09 04:12:21 字數 1655 閱讀 9927

題意

有一塊 n*m 的地,『 # 』 代表草地,『 . 』 代表空地;兩個人任意分別選取乙個點開始點火(兩個人選的點可重合),只有草地能著火,並且上下左右如果有草地的話可以蔓延。從一塊草地燒到另一塊草地的時間為 1 ,問:這塊地草地完全著火的最短時間是多少?

注意

草地雖然著火,但是並不損壞——意思就是某塊草地燒著以後,其他地方的火還可以從這裡蔓延經過。

題目雙向廣搜的意思是從兩個點同時開始廣搜

思路

首先 bfs 深搜判斷這塊地是否有不大於兩個的連通塊草地,因為最多有兩個著火點,可能有某塊草地被孤立沒有燒著。

其次列舉兩個人的所有可能的起點,同時開始廣度搜尋(就像著火一樣蔓延),並且在搜尋時用 book [ ] [ ] 陣列標記記錄著火的時間點(**中會有注釋),直到搜尋結束。

遍歷二維 book [ ] [ ] 陣列,找到最大的著火時間值。

繼續以兩人其他可能的起點遍歷。執行步驟 2 ,知道所有可能的起點遍歷完。

對於步驟 3 找到的所有最大著火事間值,找到最小值。

擼**:

#include

#include

#include

#include

using namespace std;

#define n 12

/**行*/

#define m 12

/**列*/

char s[n]

[m];

/** 要搜尋的圖*/

struct node

;int book[n]

[m];

/**標記陣列*/

int n,m;

int dir[4]

[2]=

;void

dfs(

int x,

int y)

/*深搜,每次深搜得到乙個連通塊*/

return;}

intbfs

(int sx,

int sy,

int tx,

int ty)

/*s t 分別為兩個人的起點*/

}int maxx=0;

for(

int i=

0;i)for

(int j=

0;j)// printf("%d %d ,%d %d maxx=%d\n",sx,sy,tx,ty,maxx);

return maxx;

}int

main()

}}if(num>2)

int ans=

0x3f3f3f3f

;for

(int i=

0;i)for

(int j=

0;j(s[i]

[j]==

'#')

for(

int u=

0;u)for

(int v=

0;vprintf

("case %d: %d\n"

,case++

,ans);}

return0;

}

2150 部落戰爭

題目鏈結 題目大意 給出一張地圖,乙個軍隊要征戰整個土地。一塊土地只能經過一次,有x的地方不能走,軍隊只會走r c個格仔,只會向下走,問最少需要多少軍隊能夠征戰所有的土地 題解 比較 的dag最小路徑覆蓋,把可行點連邊,搞成二分圖就好了 我的收穫 水啊 include include include...

Foj 1205 小鼠迷宮問題

問題描述 小鼠a與小鼠b身處乙個m n的迷宮中,如圖所示。每乙個方格表示迷宮中的乙個房間。這m n個房間中有一些房間是封閉的,不允許任何人進入。在迷宮中任何位置均可沿上,下,左,右4個方向進入未封閉的房間。小鼠a位於迷宮的 p,q 方格中,它必須找出一條通向小鼠b所在的 r,s 方格的路。請幫助小鼠...

FOJ 1475 不同的單詞

這道題讓我一次性ac了,但儘管如此,也讓我學到了一點,那就是如何將calloc函式的返回值強制轉換成指向一維陣列的方法!嘻嘻 是好心的教會我的 include include include int n,i,j,flag char p 21 str 21 int main while scanf d...