代码如下
#include<bits/stdc++.h>
using namespace std;
int read();
struct Node {
int x, y;
}a[55];
struct Square {
int xl, yl, xr, yr;
}b[20];
int n, m, ans = 1e9;
bool check(int k,int x)
{
bool vis[505][505] = {};
for (int i = b[k].yl; i <= b[k].yr; i++)
for (int j = b[k].xl; j <= b[k].xr; j++)
vis[i][j] = 1;
for (int i = 1; i <= x; i++)
{
if (i == k) continue;
for (int p = b[i].yl; p <= b[i].yr; p++)
for (int q = b[i].xl; q <= b[i].xr; q++)
if (vis[p][q]) return 0;
}
return 1;
}
int area(Square x)
{
return abs(x.xl - x.xr) * abs(x.yl - x.yr);
}
void dfs(int k, int x, int sum)
{
if (sum >= ans) return;
if (x > m) return;
if (k > n)
{
ans = min(ans, sum);
return;
}
// ----------------
for (int i = 1; i <= x; i++)
{
Square tmp = b[i];
b[i].xl = min(b[i].xl, a[k].x); b[i].xr = max(b[i].xr, a[k].x);
b[i].yl = max(b[i].yl, a[k].y); b[i].yr = min(b[i].yr, a[k].y);
if (check(i, x)) dfs(k + 1, x, sum - area(tmp) + area(b[i]));
b[i] = tmp;
}
// ----------------
b[x + 1].xl = b[x + 1].xr = a[k].x;
b[x + 1].yl = b[x + 1].yr = a[k].y;
if (check(x + 1, x + 1)) dfs(k + 1, x + 1, sum);
b[x + 1] = { 0,0,0,0 };
}
int main()
{
n = read(); m = read();
for (int i = 1; i <= n; i++)
a[i].x = read(), a[i].y = read();
dfs(1, 0, 0);
printf("%d", ans);
return 0;
}
int read()
{
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}