FZU2150 - Fire Game - 雙起點BFS
阿新 • • 發佈:2020-07-26
題意:
給出\(T\)組資料,每組資料給出\(N\)和\(M\),表示接下去\(N\)行\(M\)列。
圖中“#”代表草,可以點燃;“.”點代表不能點燃;“#”和“.”都以走。
現在需要同時點兩把火(位置可以重合),火的燃燒方向是上下左右,可以同時進行(注意!:不是一次只能一個方向,可以同時上下左右)。
若能燒完所有草(#),則輸出最少時間,否則輸出-1。
思路:
首先需要特判,如果草#的個數小於等於2的話,直接輸出零(因為意味著點火的地方直接著了,無需耗費時間)。
否則,
因為是同時點燃兩把火,所以相當於是雙起點的BFS。
所以,我們先把草#用結構體儲存起來,然後雙for迴圈讓每個草之間去進行一個BFS比較最短時間。
在BFS判斷的時候,可以先讓兩個起點都入隊,然後就是正常的BFS寫法。
AC程式碼:
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<cmath> #include<list> #include<stdlib.h> #include<map> #include<stack> #include<stdio.h> #include<queue> using namespace std; typedef long long ll; #define sc(T) scanf("%d",&T) #define scc(x,y) scanf("%d %d",&x,&y) #define pr(T) printf("%d\n",T) #define f(a,b,c) for (int a=b;a<=c;a++) #define ff(a,b,c) for (int a=b;a>=c;a--) #define inf 0x3f3f3f3f #define mem(a,b) memset(a,b,sizeof(a)) #define eps 1e-9 #define PI acos(-1) int n,m,p; char a[12][12]; bool book[12][12]; int to[4][2]={{1, 0},{-1,0},{0, 1},{0, -1}}; //int to[4][2]={0,1,1,0,-1,0,0,-1}; struct node { int x,y,ss; }e[110],pp,qq; int bfs(node x,node y) { //book[x.x][x.y]=book[y.x][y.y]=1; queue<node> Q; x.ss=0,y.ss=0; Q.push(x),Q.push(y); book[x.x][x.y]=1; book[y.x][y.y]=1; // int ans=0; int cnt=2; while(!Q.empty()) { pp=Q.front(); Q.pop(); // ans=pp.ss; for(int i=0;i<4;i++) { qq=pp; qq.x+=to[i][0]; qq.y+=to[i][1]; qq.ss+=1; if(qq.x>=0&&qq.x<n&&qq.y>=0&&qq.y<m&&!book[qq.x][qq.y]&&a[qq.x][qq.y]!='.') //先判邊界防止越界,或者單獨寫一個judge函式 { book[qq.x][qq.y]=1; cnt++; Q.push(qq); if(cnt==p) return qq.ss; } } } // return ans; return inf; } int main() { int T,cas=1; sc(T); while(T--) { scc(n,m); p=0; for(int i=0;i<n;i++) { scanf("%s",a[i]); for(int j=0;j<m;j++) { if(a[i][j]=='#')// # grass { e[p].x=i; e[p++].y=j; } } } if(p<=2)//特判 最多隻有兩個# 別忘了輸出 不特判的話WA { printf("Case %d: 0\n",cas++); continue; } int mi=inf; for(int i=0;i<p;i++) { for(int j=i+1;j<p;j++)//0 save time { mem(book,0); int w=bfs(e[i],e[j]); mi=min(w,mi); } } if(mi==inf) printf("Case %d: -1\n",cas++); else printf("Case %d: %d\n",cas++,mi); } return 0; }