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