暴力解法,这道题卡了我很长时间,原因在于他所谓的距离,并不是两点之间的直线距离,而是只能如下走,然后问题就很简单了
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<utility>
#include<cmath>
#include<limits.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int arr[1000][1000];
int n;
int res=inf;
int dis(int x,int y,int i,int j) {
return abs(x-i)+abs(y-j);
}
void solve(int x,int y) {
int ans=0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(arr[i][j]) {
ans+=dis(x,y,i,j);
if(ans>res) {
return;
}
}
}
}
res=ans;
}
int main() {
while(scanf("%d",&n)!=EOF) {
bool flag=0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
scanf("%d",&arr[i][j]);
if(arr[i][j]==0) {
flag=1;
}
}
}
if(!flag) {
printf("%d\n",-1);
} else {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(arr[i][j]==0) {
solve(i,j);
}
}
}
printf("%d\n",res);
}
}
return 0;
}

京公网安备 11010502036488号