Connect(广搜)

链接:Connect

Connect

题意:给两个位置A(a,b),B(c,d),需要从A到B,图中有一些水路,不能走水,但可以建隧道

隧道成本为:(rs−rt)^2+(cs−ct)^2   (rs,cs),(rt,ct)分别为隧道两端,问最小的从建隧道的最小成本

解析:

数据量很小,我们考研暴力做

用深搜或者广搜寻找变通块,遍历A连通块和B连通块的建桥成本,找最小的成本

ac:

#include<bits/stdc++.h>
#define MAXN 51
using namespace std;
int tx[4]={0,1,0,-1};
int ty[4]={1,0,-1,0};
 
char mp[MAXN][MAXN];
int vis[MAXN][MAXN];
int n;
struct node
{
    int x,y;
}aa[MAXN*MAXN],bb[MAXN*MAXN];
 
int cnta=1,cntb=1;
 
void dfs(int a,int b)
{
    for(int i=0;i<4;i++)
    {
        int dx=a+tx[i];
        int dy=b+ty[i];
        if(dx>=0&&dy>=0&&dx<n&&dy<n)
        {
            if(mp[dx][dy]=='0'&&vis[dx][dy]==0)
            {
                aa[cnta].x=dx;
                aa[cnta].y=dy;
                cnta++;
                vis[dx][dy]=1;
                dfs(dx,dy);
            }
        }
    }
}
 
void dfs2(int a,int b)
{
    for(int i=0;i<4;i++)
    {
        int dx=a+tx[i];
        int dy=b+ty[i];
        if(dx>=0&&dy>=0&&dx<n&&dy<n)
        {
            if(mp[dx][dy]=='0'&&vis[dx][dy]==0)
            {
                bb[cntb].x=dx;
                bb[cntb].y=dy;
                cntb++;
                vis[dx][dy]=1;
                dfs2(dx,dy);
            }
        }
    }
}
 
int main()
{
    int a,b,c,d;
    scanf("%d",&n);
    scanf("%d%d",&a,&b);
    scanf("%d%d",&c,&d);
    for(int i=0;i<n;i++)
        scanf("%s",&mp[i]);
    aa[0].x=a-1,aa[0].y=b-1;
    bb[0].x=c-1,bb[0].y=d-1;
 
    memset(vis,0,sizeof(vis));
    dfs(a-1,b-1);
    memset(vis,0,sizeof(vis));
    dfs2(c-1,d-1);
 
    int maxs=99999999;
    for(int i=0;i<cnta;i++)
        for(int j=0;j<cntb;j++)
        {
            maxs=min(maxs,(aa[i].x-bb[j].x)*(aa[i].x-bb[j].x)+(aa[i].y-bb[j].y)*(aa[i].y-bb[j].y));
        }
    printf("%d\n",maxs);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值