Fork me on GitHub

FZU 2150 Fire Game --两点同步搜索

枚举两点,然后同步BFS,看代码吧,很容易懂的。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define Mod 1000000007
using namespace std;

struct Point
{
    int x,y;
    int step;
}S;
char mp[13][13];
int vis[13][13];
int n,m;
int lef;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
queue<Point> que;

bool OK(int nx,int ny)
{
    if(nx < n && nx >= 0 && ny < m && ny >= 0)
        return true;
    return false;
}

int BFS()
{
    int maxi = 0;
    while(!que.empty())  //同步搜索
    {
        int SIZE = que.size();
        while(SIZE--)
        {
            Point tmp = que.front();
            que.pop();
            int nx = tmp.x;
            int ny = tmp.y;
            int step = tmp.step;
            maxi = max(maxi,step);
            Point now;
            for(int k=0;k<4;k++)
            {
                int kx = nx + dx[k];
                int ky = ny + dy[k];
                if(!OK(kx,ky) || vis[kx][ky])
                    continue;
                if(mp[kx][ky] == '#')
                {
                    vis[kx][ky] = 1;
                    now.x = kx;
                    now.y = ky;
                    now.step = step+1;
                    que.push(now);
                    lef--;
                }
            }
        }
    }
    if(lef == 0)
        return maxi;
    else
        return -1;
}

int main()
{
    int t,cs = 1,i,j,k,h;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int cnt = 0;
        for(i=0;i<n;i++)
        {
            scanf("%s",mp[i]);
            for(j=0;j<m;j++)
                if(mp[i][j] == '#')
                    cnt++;
        }
        int flag = 0;
        int tag = Mod;
        for(i=0;i<n;i++)   //第一个点
        {
            for(j=0;j<m;j++)
            {
                if(mp[i][j] == '#')
                {
                    for(k=i;k<n;k++)   //第二个点
                    {
                        for(h=(k==i?j:0);h<m;h++)
                        {
                            if(mp[k][h] == '#')
                            {
                                memset(vis,0,sizeof(vis));
                                S.x = i,S.y = j,S.step = 0;
                                que.push(S);
                                lef = cnt-1;
                                vis[i][j] = 1;
                                if(!(i==k&&j==h))
                                {
                                    S.x = k,S.y = h,S.step = 0;
                                    que.push(S);
                                    vis[k][h] = 1;
                                    lef--;
                                }
                                int res = BFS();
                                if(res != -1)
                                {
                                    flag = 1;
                                    tag = min(tag,res);
                                }
                            }
                        }
                    }
                }
            }
        }
        if(flag)
            printf("Case %d: %d\n",cs++,tag);
        else
            printf("Case %d: -1\n",cs++);
    }
    return 0;
}
View Code
posted @ 2014-07-16 21:00  whatbeg  阅读(371)  评论(0编辑  收藏  举报