FZU - 2150-Fire Game BFS-枚举

Posted ckxkexing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU - 2150-Fire Game BFS-枚举相关的知识,希望对你有一定的参考价值。

Fire Game 

题意:

两个小朋友可以任选一块草地点火,草地可以不同,也可以相同,问最少的烧光草地的时间。

思路:

一开始看到这个以为是联通块计数,没想到这道题通过枚举两个起始点作为队列的初始点,每次跑一边bfs即可。

 

技术分享图片
#include <algorithm>
#include  <iterator>
#include  <iostream>
#include   <cstring>
#include   <cstdlib>
#include   <iomanip>
#include    <bitset>
#include    <cctype>
#include    <cstdio>
#include    <string>
#include    <vector>
#include     <cmath>
#include     <queue>
#include      <list>
#include       <map>
#include       <set>
using namespace std;
//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000")  //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "
";
#define pb push_back
#define pq priority_queue



typedef long long ll;
typedef unsigned long long ull;

typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3;

//priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl ‘
‘

#define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A)  //用来压行
#define REP(i , j , k)  for(int i = j ; i <  k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que;

const ll mos = 0x7FFFFFFFLL;  //2147483647
const ll nmos = 0x80000000LL;  //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3fLL; //18
const int mod = 1e9+7;

const double PI=acos(-1.0);

// #define _DEBUG;         //*//
#ifdef _DEBUG
freopen("input", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
/*-----------------------showtime----------------------*/
            const int maxn = 20;
            int n,m;
            string  mp[maxn];
            int dp[maxn][maxn];
            
            int nt[4][4] = {
                {1,0},{0,1},{-1,0},{0,-1},
            };
            struct node
            {
                int x,y,step;                
            }q[maxn*maxn];
            int mx,tot;
            void bfs(node a,node b){
                mx = 0;
                for(int i=0; i<maxn; i++){
                    for(int j=0; j<maxn; j++)dp[i][j] = inf;
                }
                queue<node>que;
                que.push(a);
                if(a.x!=b.x||a.y!=b.y)que.push(b);
                dp[a.x][a.y] = 0;
                dp[b.x][b.y] = 0;
                while(!que.empty()){
                    int x = que.front().x,y = que.front().y,s = que.front().step;
                    que.pop();
                    for(int i=0 ; i<4; i++){
                        int nx = x + nt[i][0],ny = y + nt[i][1];
                        if(nx < 0||nx >=n || ny <0||ny>=m)continue;
                        if(mp[nx][ny]==.)continue;
                        if(dp[nx][ny] > s + 1){
                                dp[nx][ny] = s + 1;
                                mx = max(mx,s+1);
                                node tmp={nx,ny,s+1};
                                que.push(tmp);

                        }
                    }
                }
            }
            void solve(){
                cin>>n>>m;
                
                for(int i=0; i<n; i++){
                    cin>>mp[i];
                }
                int cnt = 0,ans = inf;
                for(int i=0; i<n ; i++){
                    for(int j=0; j<m; j++){
                      if(mp[i][j]==#){
                            q[++cnt].x = i;
                            q[cnt].y = j;
                            q[cnt].step = 0;
                      }
                    }
                }
                
                for(int i=1; i<=cnt; i++)
                {

                    for(int j=i; j<=cnt; j++){
                        bfs(q[i],q[j]);
                        int flag = 1;
                        for(int x = 0; x < n; x++){
                            for(int y = 0; y<m; y++){
                                if(dp[x][y] >=inf && mp[x][y] == #)flag= 0;
                            }
                        }
                        if(flag)ans = min(ans, mx);
                        
                    }
                }
                if(ans < inf)cout<<ans<<endl;
                else cout<<-1<<endl;
            }
int main(){ 
            int T;  cin>>T;
            for(int t=1;t<=T;t++){
                cout<<"Case "<<t<<": ";
                solve();
            }
            return 0;
}
FZU-2150

 

以上是关于FZU - 2150-Fire Game BFS-枚举的主要内容,如果未能解决你的问题,请参考以下文章

FZU 2150 Fire Game (高姿势bfs--两个起点)

FZU 2150 Fire Game (高姿势bfs--两个起点)

FZU2150 Fire Game BFS搜索

FZU-Problem 2150 Fire Game(两点bfs)

FZU - 2150-Fire Game BFS-枚举

FZU2150 :Fire Game (双起点BFS)