Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2), problem: (C) Connect 【dfs】

题意

0’表示陆地,‘1’表示水,在水上行走不会耗费金钱,如果要通过水,则需要建隧道,花费费用是(x1-x2)(x1-x2)+(y1-y2)(y1-y2),求最小花费。

思路

n比较小,可以暴力搜索

code

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=50+5;
int n;
char mp[maxn][maxn];
int vis[maxn][maxn];
struct node{
    int x,y;
}s,e;
int flag;
vector<node> ans[3];
void dfs(int x,int y,int op){
    if(x<1||x>n||y<1||y>n) return;
    if(vis[x][y]||mp[x][y]=='1') return;
    if(x==e.x&&y==e.y&&op==1) flag=1;
    vis[x][y]=1;
    ans[op].push_back(node{x,y});
    dfs(x+1,y,op);
    dfs(x-1,y,op);
    dfs(x,y+1,op);
    dfs(x,y-1,op);
    return;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    cin>>s.x>>s.y;
    cin>>e.x>>e.y;
    for(int i=1;i<=n;i++)
        cin>>mp[i]+1;
    flag=0;
    dfs(s.x,s.y,1);
    int mi=0x3f3f3f3f;
    if(flag)
        cout<<0<<endl;
    else{
        dfs(e.x,e.y,2);
        for(auto &i:ans[1]){
            for(auto &j:ans[2]){
                mi=min(mi,(i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
            }
        }
        cout<<mi<<endl;
    }
    return 0;
}
学如逆水行舟,不进则退
发布了467 篇原创文章 · 获赞 1143 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/104172374