关键是解决相互制约关系,由数据量很小可知方法一定很水。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <math.h>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
struct obj
{
int ux,uy,dx,dy,c;
}p[20];
int n;
int vis[20];
int mat[20][20];
int start[20];
int ans;
void dfs(int u,int times)
{
vis[u]=1;
bool f1=true;
for(int i=1;i<=n;++i)
if(!vis[i])
{
f1=false;
bool flag=true;
for(int j=1;j<=n;++j)
if(mat[i][j] && !vis[j])
{
flag=false;
break;
}
if(flag)
{
dfs(i,p[u].c==p[i].c?times:times+1);
}
}
if(f1)
{
if(ans>times)
ans=times;
}
vis[u]=0;
}
int vis_row[20];
void build(int u)
{
if(vis_row[u])
return;
for(int i=1;i<=n;++i)
if(mat[u][i])
{
build(i);
for(int j=1;j<=n;++j)
if(mat[i][j])
mat[u][j]=1;
}
vis_row[u]=1;
}
int main ()
{
int test;scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d%d%d%d%d",&p[i].uy,&p[i].ux,&p[i].dy,&p[i].dx,&p[i].c);
}
memset(vis,0,sizeof(vis));
memset(mat,0,sizeof(mat));
memset(start,0,sizeof(start));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
//bool flag=true;
if(p[j].dy==p[i].uy && p[j].dx>p[i].ux && p[j].ux<=p[i].dx)
mat[i][j]=1;
}
memset(vis_row,0,sizeof(vis_row));
for(int i=1;i<=n;++i)
if(!vis_row[i])
build(i);
for(int i=1;i<=n;++i)
{
bool flag=true;
for(int j=1;j<=n;++j)
if(mat[i][j])
flag=false;
if(flag)
start[i]=1;
}
ans=100000000;
for(int i=1;i<=n;++i)
if(start[i])
dfs(i,1);
printf("%d\n",ans);
}
return 0;
}