1 #include<cstring>
 2 #include<iostream>
 3 using namespace std;
 4 struct node{
 5     int x1,y1,x2,y2,color;
 6 }G[15];
 7 int n,ans,deg[15];//n表区域的个数,ans存储最终结果,deg存储拓扑图中各点的入度
 8 bool vis[15],m[15][15];//vis用于标记是否访问过,m表示各点之间的联系
 9 void buildG()//建立拓扑图,用于确定优先级
10 {
11     for(int i=0;i<n;++i)
12         for(int j=0;j<n;++j)
13             if(G[i].y2==G[j].y1&&!(G[i].x2<G[j].x1||G[j].x2<G[i].x1)){
14                 m[i][j]=1;//建立关系网
15                 deg[j]++;//入度+1
16             }
17 }
18 void dfs(int dep,int cnt,int curC)//深度优先搜索
19 {
20     if(cnt>=ans) return;//剪枝,假如当前取画笔次数已大于之前结果,直接返回
21     if(dep==n){//到达解答树目标状态,保存ans值,因前面有cnt>=ans时退出,所以当前cnt较小
22         ans=cnt;
23         return;
24     }
25     int i,j;
26     for(i=0;i<n;++i)
27         if(!deg[i]&&!vis[i]){//找入度为0且还未着色的点开始,
28             vis[i]=1;
29             for(j=0;j<n;++j)
30                 if(m[i][j])
31                     deg[j]--;//子节点入度减一
32             if(G[i].color==curC) dfs(dep+1,cnt,curC);//与当前颜色符合,只需往下遍历
33             else dfs(dep+1,cnt+1,G[i].color);//否则,换画笔及颜色
34             for(j=0;j<n;++j)
35                 if(m[i][j])
36                     deg[j]++;//递归结束后,还原其初始状态
37             vis[i]=0;//标志取消
38         }
39 }
40 int main()
41 {
42     int i,j,T;
43     cin>>T;
44     while(T--)
45     {
46         cin>>n;
47         for(i=0;i<n;++i)
48             cin>>G[i].y1>>G[i].x1>>G[i].y2>>G[i].x2>>G[i].color;
49         memset(m,0,sizeof(m));
50         memset(deg,0,sizeof(deg));
51         buildG();
52         ans=15;
53         dfs(0,0,0);//都从0开始
54         cout<<ans<<endl;
55     }
56     return 0;
57 }

//DFS+拓扑排序

转载于:https://www.cnblogs.com/shihuajie/archive/2012/08/17/2644662.html

poj1691 Painting A Board相关推荐

  1. POJ 1691 - Painting A Board + Python (DFS)

    题目链接:1691 -- Painting A Board 参考资料:POJ 1691 - Painting A Board | 眈眈探求 特别注意:注意本文的升序排列语句. 一 题目描述: 给定一个 ...

  2. Painting A Board --POJ 1691

    1.题目类型:暴力法.DFS. 2.解题思路:题意,一块大的矩形区域的被分成多个矩形区域,现在要给不同的区域涂上不同的颜色,有不同颜色的刷子可以提供,每个刷子可以刷一种不同的颜色.每刷一次,将刷尽可能 ...

  3. POJ 1691 Painting A Board

    把每个方形看成一个点,如果先染a,再染b,a->b有向线,如果入度为0就可以染了.构图跟拓扑排序似的, 然后搜索回溯方法跟zoj1004差不多 代码: #include<iostream& ...

  4. pku 1691 Painting A Board DFS 抽象建图 + 拓扑排序

    http://poj.org/problem?id=1691 题意: 给定一个大矩形,然后给出n个需要染色的小矩形的左上角的坐标,右下角的坐标以及该矩形要染得颜色,每个颜色对应的一把刷子.问将这些小矩 ...

  5. POJ的题目分类(两个版本)

    版本一: 简单题 1000A+B Problem 1001Exponentiation 1003 Hangover 1004 Financial Management 1005 I Think I N ...

  6. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  7. Effective C# 原则11:选择foreach循环

    Effective C# 原则11:选择foreach循环 Item 11: Prefer foreach Loops C#的foreach语句是从do,while,或者for循环语句变化而来的,它相 ...

  8. 【转】别人整理的DP大全

    为什么80%的码农都做不了架构师?>>>    动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...

  9. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  10. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

最新文章

  1. Flask-RESTful之响应处理
  2. 设计模式第七讲-责任链模式
  3. 【错误记录】BLE 蓝牙搜索失效 ( 关闭了 GPS 定位导致的问题 | 蓝牙串口工具推荐 )
  4. 常用口语绝佳句型100句(2)
  5. mysql 主从同步-读写分离
  6. 数据分析方法-聚类算法
  7. 电脑用电量_闲置电脑也能赚钱?「BOINC算力地球」借区块链技术扩大共享算力...
  8. IndexAction.java (Java之负基础实战)
  9. 亚马逊EC2服务器使用Rsync+Inotify实时同步
  10. 清华大学计算机考研资料汇总
  11. 树莓派安装wps2019教程
  12. java英语美式读音
  13. Cisco思科路由器配置GRE通道的简单例子
  14. 计算机组成原理与体系结构——随机存储器和只读存储器
  15. coursera 助学金申请模版
  16. unity物品图鉴(xml数据加载)
  17. elemtnui 表格如何修改某行文字颜色(elemtnui table 修改某行文字颜色)
  18. android recyclerview监听滑动状态
  19. 电容震动音的滋滋声音的原因与消除
  20. 区块链上的虚拟开放世界游戏是怎样的?| TVP思享

热门文章

  1. 代码示例_mmap的实现
  2. BZOJ3714: [PA2014]Kuglarz 最小生成树
  3. WPF太阳、地球、月球运动轨迹模拟
  4. BZOJ 2957 分块
  5. android---gettag()与settag()的妙用
  6. 通过Rman catalog 创建及管理Oracle数据库备份
  7. PhoneGap+Xcode6环境配置
  8. 自写的简单屏蔽特定字符的TextBox和数字TextBox
  9. system()函数
  10. 用window.showModalDialog()实现DIV模式弹出窗口