对所有点DFS判断半径,有几个限制,已经使用的点要注意他的扩散半径,目前的点没有被其他点的扩散包含,目前点到四边的距离。注意负数!!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include <stack>
#define LL long long
using namespace std;
const int N = 1e6 + 10;
int xx,yy, x2, y2;
struct pot {
double x, y;
}p[10];
int n, vis[10];
double dis[10][10], r[10];
double ans = 0;
double cal(int x) {
double d;
double s1=min(abs(p[x].x - xx), abs(p[x].y -yy));
double s2= min(abs(x2 - p[x].x),abs(y2 - p[x].y));
double a=min(s1,s2);
for (int i=1; i<=n; i++) {
if (x!=i&&r[i]) {
//double d=sqrt((p[i].x - p[x].x) * (p[i].x - p[x].x) + (p[i].y - p[x].y) * (p[i].y - p[x].y));
a=min(a,max(dis[i][x]-r[i],0.0));
}
}
return a;
}
void dfs(int num, double sum) {
if (num > n) {
ans = max(sum, ans);
return;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
vis[i] = 1;
r[i] = cal(i);
dfs(num + 1, sum+r[i]*r[i]*3.1415926535);
vis[i] = 0;
r[i]=0;
}
}
}
int main()
{
double ss;
cin >> n;
cin >> xx >>yy >> x2 >> y2;
ss=abs(xx-x2)*abs(yy-y2);
if (xx > x2)swap(xx, x2);
if (yy >> y2)swap(yy, y2);
for (int i = 1; i <= n; i++) {
cin >> p[i].x >> p[i].y;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dis[i][j] = sqrt((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y));
dis[j][i] = dis[i][j];
}
}
dfs(1, 0);
printf("%d",(int)(ss-ans+0.5));
return 0;
}