dfs
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n;
struct e{
int x1,y1,x2,y2,c;
};
e a[16];
struct ee{
int data;
ee *next;
};
ee edge[16];
int ans;
int d[16];
int v[16];
void solve(int num,int value,int color){
int i,j,k;
if(value>ans) return;
if(num==n)
{
ans=value;
return;
}
for(i=1;i<=n;i++)
{
if(d[i]==0&&v[i]==0)
{
v[i]=1;
ee *p=edge[i].next;
while(p){
d[p->data]--;
p=p->next;
}
if(color!=a[i].c) solve(num+1,value+1,a[i].c);
else solve(num+1,value,color);
p=edge[i].next;
while(p)
{
d[p->data]++;
p=p->next;
}
v[i]=0;
}
}
}
void build(){
int i,j,k;
for(i=1;i<=n;i++)
{
edge[i].data=i;
edge[i].next=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[j].x1==a[i].x2&&((a[i].y1>=a[j].y1&&a[i].y1<a[j].y2)||(a[j].y1>=a[i].y1&&a[j].y1<a[i].y2)))
{
ee *p=new ee;
p->data=j;
p->next=edge[i].next;
edge[i].next=p;
d[j]++;
}
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int cas;
cin>>cas;
while(cas--)
{
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
cin>>n;
ans=n+1;
for(i=1;i<=n;i++)
cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2>>a[i].c;
build();
solve(0,0,0);
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}