暴力解法,这道题卡了我很长时间,原因在于他所谓的距离,并不是两点之间的直线距离,而是只能如下走,然后问题就很简单了

#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;
}