调了一上午,单步的效率太低了,特别是在有递归的情况下。。。下午来了,输出调试了下,就发现bug了,各种混乱啊。
比较高兴的事,1Y了。本来还准备用edge1优化一下的,结果完全没用到。。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node
{
int x1,y1,x2,y2,c;
} p[];
struct n1
{
int u,v,next;
} edge1[],edge2[];
int first1[],first2[];
int to1,to2,n;
int o[];
void CL()
{
to1 = to2 = ;
memset(first1,-,sizeof(first1));
memset(first2,-,sizeof(first2));
}
int fun(int x,int y)
{
if(p[x].x2 <= p[y].x1)
{
if(p[x].y1 < p[y].y2&&p[x].y1 > p[y].y1)
return ;
else if(p[x].y2 < p[y].y2&&p[x].y2 > p[y].y1)
return ;
else if(p[y].y1 < p[x].y2&&p[y].y1 > p[x].y1)
return ;
else if(p[y].y2 < p[x].y2&&p[y].y2 > p[x].y1)
return ;
else if(p[x].y1 == p[y].y1&&p[x].y2 == p[y].y2)
return ;
else
return ;
}
return ;
}
void add1(int u,int v)
{
edge1[to1].u = u;
edge1[to1].v = v;
edge1[to1].next = first1[u];
first1[u] = to1 ++;
}
void add2(int u,int v)
{
edge2[to2].u = u;
edge2[to2].v = v;
edge2[to2].next = first2[u];
first2[u] = to2 ++;
}
int judge(int x)
{
int i;
for(i = first2[x];i != -;i = edge2[i].next)
{
if(!o[edge2[i].v])
break;
}
if(i == -)
return ;
else
return ;
}
int dfs(int x,int c,int step)
{
int i;
if(x < )
return ;
if(step > n)
return ;
for(i = ;i <= n;i ++)
{
int z = judge(i);
if(!o[i]&&z&&c == p[i].c)
{
o[i] = ;
if(dfs(x,p[i].c,step+))
{
return ;
}
o[i] = ;
}
else if(!o[i]&&z&&c != p[i].c)
{
o[i] = ;
if(dfs(x-,p[i].c,step+))
{
return ;
}
o[i] = ;
}
}
return ;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
CL();
for(i = ; i <= n; i ++)
{
scanf("%d%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2,&p[i].c);
}
for(i = ; i <= n; i ++)
{
for(j = ; j <= n; j ++)
{
if(i != j)
{
if(fun(i,j))
{
add1(i,j);
add2(j,i);
//printf("%d %d\n",j,i);
}
}
}
}
for(i = ;i <= n-;i ++)
{
memset(o,,sizeof(o));
if(dfs(i,,))
break;
}
printf("%d\n",i);
}
return ;
}