題意
有一塊 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...