FZU

FZU - 2150

思路:bfs。注意初始化啊,忘了清空vector,TLE一个下午。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define ll long long
#define pb push_back
const int N=15;
const int INF=0x3f3f3f3f;
char mp[N][N];
bool vis[N][N];
int n,m;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
struct Node
{
    int x,y;
    int step;
};
vector<Node>a;
int bfs(Node a,Node b,int c)
{
    a.step=0;
    b.step=0;
    queue<Node>q;
    q.push(a);
    q.push(b);
    vis[a.x][a.y]=true;
    vis[b.x][b.y]=true;
    Node now,next;
    int ans=0,cnt=2;
    while(!q.empty())
    {
        now=q.front(); 
        q.pop();
        ans=now.step;
        for(int i=0;i<4;i++)
        {
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
            if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&mp[next.x][next.y]=='#'&&!vis[next.x][next.y])
            {
                next.step=now.step+1;
                q.push(next);
                vis[next.x][next.y]=true;
                cnt++;
            }
        }
    }
    if(cnt!=c)return INF;
    else return ans;
}
int main()
{
    int t,Case=0;
    scanf("%d",&t);
    while(t--)
    {
        a.clear();
        Case++;
        int ans=INF;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%s",mp[i]);
        }
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            if(mp[i][j]=='#')
            {
                Node t;
                t.x=i;
                t.y=j;
                a.pb(t);
                cnt++;
            }
        }
        if(cnt<=2)
        {
            printf("Case %d: %d
",Case,0);
        }
        else
        {    
            for(int i=0;i<a.size()-1;i++)
            {
                for(int j=i+1;j<a.size();j++)
                {
                    memset(vis,false,sizeof(vis));
                    ans=min(ans,bfs(a[i],a[j],cnt));
                }
            }
            if(ans==INF)ans=-1;
            printf("Case %d: %d
",Case,ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/widsom/p/7281112.html