poj 1691 图方块 end

#include<iostream>
int m,n;
typedef struct node
{
	int upx,upy;
	int dox,doy;
	int c;
}node;
node point[20];
int visit[20];
int map[20][20];
int indegree[20];
int min=1000;
void handle()  //建立有向图
{   
	
	 for(int i=0;i<20;i++)
		 {    
			  visit[i]=0;
			 indegree[i]=0;
	      }
	 for(int i=0;i<20;i++)
		{ for(int j=0;j<20;j++)
	      {
		 map[i][j]=0;
	      }

	 }
	 for(int i=0;i<n;i++)  
       { for(int j=0;j<n;j++)  
          {  
           if(point[i].dox==point[j].upx&&!(point[i].upy>point[j].doy||point[i].doy<point[j].upy))  
             {  
				
                 map[i][j]=1;    //存储是否连接
                 indegree[j]++;  //存上面与他相邻矩形的数目
             }  
           }  
	
	
	 }
}
void dfs(int j_num,int col,int o_num)  // 染色的矩形数目 当前画笔的颜色  当前已经用画笔的数目
{
	if(o_num>=min)
	{
		return;
	}
	
	if(j_num==n)
	{   
		min=o_num;
		//printf("%d",o_num);
		
	}
	for(int i=0;i<n;i++)
	{	if(!(indegree[i])&&!visit[i])
		{
			visit[i]=1;
			for(int j=0;j<n;j++)
			{
			    if(map[i][j])
				{
					indegree[j]--;
				}
		    }
			if(point[i].c==col)
			{
				dfs(j_num+1,col,o_num); 
			}else{
				dfs(j_num+1,point[i].c,o_num+1);
			}
			visit[i]=0;
			for(int j=0;j<n;j++)  
                   if(map[i][j])  
                   indegree[j]++;  
	    }
	}
}
int main()
{ 
	freopen("input.txt","r",stdin);
    scanf("%d",&m);
    while(m--)
    {   min=1000;
       scanf("%d",&n);
	   for(int i=0;i<n;i++)
	   {
		  scanf("%d%d%d%d%d",&point[i].upx,&point[i].upy,&point[i].dox,&point[i].doy,&point[i].c);
	   }
	   handle();		
	   dfs(0,0,0);
       printf("%d\n",min);	
       }
   return 0;
  
}

 

转载于:https://www.cnblogs.com/dahuacarry/p/6252969.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值