记录
#include <bits/stdc++.h>
using namespace std;
struct Matrix
{
int x1, y1, x2, y2, Color;
};
Matrix A[18];
int N, Ans = 20;
int Constraint[18];
int Mat[100][100];
int F[1 << 16][21];
int main()
{
cin >> N;
for (int k = 0; k < N; ++k)
{
cin >> A[k].x1 >> A[k].y1 >> A[k].x2 >> A[k].y2 >> A[k].Color;
for (int i = A[k].x1; i < A[k].x2; ++i)
{
for (int j = A[k].y1; j < A[k].y2; ++j)
{
Mat[i][j] = k;
}
}
}
for (int k = 0; k < N; ++k)
{
if (!A[k].x1)
{
continue;
}
for (int j = A[k].y1; j < A[k].y2; ++j)
{
Constraint[k] |= (1 << Mat[A[k].x1 - 1][j]);
}
Constraint[k] |= (1 << k);
}
memset(F, 127, sizeof(F));
for (int i = 1; i <= 20; ++i)
{
F[0][i] = 1;
}
for (int i = 1; i < 1 << N; ++i)
{
for (int j = 0; j < N; ++j)
{
if ((Constraint[j] & i) != Constraint[j])
{
continue;
}
int& Crt = F[i][A[j].Color];
Crt = F[i ^ (1 << j)][A[j].Color];
for (int k = 1; k <= 20; ++k)
{
if (A[j].Color == k)
{
continue;
}
Crt = min(Crt, F[i ^ (1 << j)][k] + 1);
}
}
}
for (int i = 1; i <= 20; ++i)
{
Ans = min(Ans, F[(1 << N) - 1][i]);
}
cout << Ans << endl;
return 0;
}