BFS廣度優先搜尋(10)--fzu2150(基礎題)
這道題就是說任選兩個是‘#’的格子(‘#‘表示此格子是能夠燃燒的草,‘.’ 表示是不能燃燒的石頭),同時點燃,一個格子的火一秒鐘能夠將它上下左右的是草的格子都燃燒掉,問最少經過多少秒將所有是草的格子燃燒完,若不能燃燒完,輸出-1。
解題思路很簡單,就是分別列舉兩個不相同的格子選中點燃(若只有一個或者兩個格子,則直接輸出0),列舉完所有情況後再比較輸出所用最少的時間。程式碼如下:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char map[12][12];
int vis[12][12];
int d[4][2]={0,1,1,0,0,-1,-1,0}; //上下左右四個方向
int n,m;
struct node{
int x,y;
int step;
};
int fire[12][12]; //已經燃起火的格子為1
node f[100];
int cont; //是草的格子的數量
int Bfs(node s,node s1){
queue<node>q;
node e;
int i;
memset(fire,0,sizeof(fire));
fire[s.x][s.y]=1;
fire[s1.x][s1.y]=1;
q.push(s);
q.push(s1);
int num=2;
while(!q.empty())
{
s=q.front();
q.pop();
for(i=0;i<4;i++){
int xx=s.x+d[i][0];
int yy=s.y+d[i][1];
if(xx<0||yy<0||xx>=n||yy>=m)
continue;
if(map[xx][yy]=='.')continue;
if(fire[xx][yy])continue;
fire[xx][yy]=1;
num++;
e.x=xx;
e.y=yy;
e.step=s.step+1;
q.push(e);
}
if(q.empty()&&num==cont)return s.step; //所有為草的格子都被燃燒完了
}
return -1; //有為草的格子沒有燃燒完
}
int main()
{
int T,i,j;
int cnt=0;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
memset(f,0,sizeof(f));
for(i=0;i<n;i++){
scanf("%s",map[i]);
}
cont=0;
for(i=0;i<n;i++){ //任選兩個是草的格子為起點開始Bfs
for(j=0;j<m;j++){
if(map[i][j]=='#'){
node a;
a.x=i;
a.y=j;
a.step=0;
f[cont++]=a;
}
}
}
if(cont==1||cont==2){ //有草的格子只有一個或者兩個
printf("Case %d: 0\n",++cnt);
continue;
}
int ans=105;
for(i=0;i<cont;i++){ //找出所用時間最小的
for(j=i+1;j<cont;j++){
int ans1=Bfs(f[i],f[j]);
if(ans1==-1)
{
if(ans==105)ans=-1;
}
else{
if(ans==-1)ans=ans1;
else ans=(ans<ans1)?ans:ans1;
}
}
}
printf("Case %d: %d\n",++cnt,ans);
}
return 0;
}
相關文章
- BFS廣度優先搜尋(11)--hdu2102(基礎題)
- BFS廣度優先搜尋(6)--poj3414(基礎題)
- BFS廣度優先搜尋(4)--hdu2717(poj3278)(基礎題)
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- BFS廣度優先搜尋(3)--poj2251(zoj1940)(基礎題)
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 演算法競賽——BFS廣度優先搜尋演算法
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- BFS-圖的廣度優先搜尋--鄰接矩陣矩陣
- 0演算法基礎學演算法 搜尋篇第二講 BFS廣度優先搜尋的思想演算法
- BFS廣度優先搜尋(5)(亦可以用DFS)--hdu1241(poj1562)(基礎題)
- c++ 廣度優先搜尋(寬搜)C++
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- js版本的(廣、深)度優先搜尋JS
- 演算法筆記(廣度優先搜尋)演算法筆記
- 深度和廣度優先搜尋演算法演算法
- 【程式碼隨想錄】廣度優先搜尋
- 廣度優先搜尋,分支限界- ZOJ - 1136 Multiple
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 佇列,廣度搜尋-ZOJ 1148 The Game (BFS)佇列GAM
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 《圖論》——廣度優先遍歷演算法(BFS)圖論演算法
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- Swift 演算法實戰之路:深度和廣度優先搜尋Swift演算法
- (BFS廣度優先演算法) 油田問題演算法
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 廣度優先搜尋相關面試演算法總結(非圖論方面)面試演算法圖論
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python
- DFS深度優先搜尋(3)--hdu2181(哈密頓繞行世界問題)(基礎題)
- Python 圖_系列之基於鄰接炬陣實現廣度、深度優先路徑搜尋演算法Python演算法
- leetcode 刷題之深度優先搜尋LeetCode
- Android程式設計師面試會遇到的演算法(part 2 廣度優先搜尋)Android程式設計師面試演算法
- 廣度優先遍歷圖解圖解
- 工作安排(dfs深度優先搜尋)
- 演算法~廣度優先搜尋(Breadth First Search)一石激起幹層浪(附帶6道練習題)演算法