题意
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;
}
学如逆水行舟,不进则退