POJ 1691 Painting A Board(DFS)

链接

题意 :
看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子。因为你要刷一个矩形之前,必须把这个矩形上方与之直接相邻的所有矩形先刷掉才能刷这个,如果你先用了红色的刷子,然后又用了蓝色的刷子,最后又用了红色的刷子,这算是3次使用而不是两次,样例中,用红色刷B所以D也可以刷了,用蓝色先刷A,然后可以刷C,因为B刷了所以E也可以刷了,最后换刷子把剩下的刷掉,总共三次。

思路 : 这个题可以用DFS也可以用状压DP,我用的DFS,因为没压出来,,,,,,,这里有分析,链接1链接2。先将每个矩形看成一个点,然后如果存在上下关系的话,下边那个点的入度+1,先找入度为0的点开始染色,如果这个点已经染掉了的话,那它下边的点入度要减1.。。。。。。。


 1 //1691
2 #include <stdio.h>
3 #include <string.h>
4 #include <iostream>
5
6 using namespace std ;
7
8 struct rectangle
9 {
10 int lx,ly ;
11 int rx,ry ;
12 int R ;
13 } rec[16];
14 int degree[16] ;
15 bool mapp[16][16],vis[16] ;
16 int M ,n;
17 int cnt ;
18
19 void build()
20 {
21 memset(mapp,false,sizeof(mapp)) ;
22 memset(degree,0,sizeof(degree)) ;
23 memset(vis,false,sizeof(vis)) ;
24 for(int i = 0 ; i < n ; i++)
25 {
26 for(int j = 0 ; j < n ; j++)
27 {
28 if(i == j) continue ;
29 else
30 {
31 if(rec[i].ly == rec[j].ry && !(rec[i].rx < rec[j].lx || rec[j].rx < rec[i].lx))
32 {
33 mapp[i][j] = true ;
34 degree[i] ++ ;
35 }
36 }
37 }
38 }
39 }
40
41 void DFS(int r,int ans,int step)
42 {
43 if(ans > cnt) return ;
44 if(step == n)
45 {
46 cnt = ans ;
47 return ;
48 }
49 for(int i = 0 ; i < n ; i++)
50 {
51 if(!vis[i] && degree[i] == 0)
52 {
53 vis[i] = true ;
54 for(int j = 0 ; j < n ; j++)
55 if(mapp[j][i])
56 degree[j] -- ;
57 if(rec[i].R == r ) DFS(r,ans,step+1) ;
58 else DFS(rec[i].R,ans + 1,step+1) ;
59 vis[i] = false ;
60 for (int j = 0; j < n; j++)
61 {
62 if (mapp[j][i]) degree[j]++;
63 }
64 }
65 }
66 }
67 int main()
68 {
69 scanf("%d",&M) ;
70 while(M--)
71 {
72 scanf("%d",&n) ;
73 for(int i = 0 ; i < n ; i++)
74 scanf("%d %d %d %d %d",&rec[i].ly,&rec[i].lx,&rec[i].ry,&rec[i].rx,&rec[i].R) ;
75 build() ;
76 cnt = 9999999 ;
77 DFS(0,0,0) ;
78 printf("%d\n",cnt) ;
79 }
80 return 0 ;
81 }

POJ 1691 Painting A Board(DFS),布布扣,bubuko.com

时间: 2024-11-03 01:18:14

POJ 1691 Painting A Board(DFS)的相关文章

[poj 1691] Painting A Board dfs+拓扑排序

Painting A Board Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3611 Accepted: 1795 Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat board fully covered by adjacent non-overlapping rectangle

POJ 1691 Painting A Board

题目大意: 墙上有一块区域被分成了n个矩形,每个矩形要涂上各自的颜色.为了保证完美要求这一块区域可以进行涂色的条件是它上方的所有区域都已经涂好颜色,这样就不会有后续的操作影响这块区域的颜色.但是如果两块区域颜色不同就要换涂颜色用的刷子.问最少需要换几次. 解题思路: 区域涂色的大体次序是由拓扑排序决定的,当有多个区域在同一层次时需要枚举这些区域来保证换刷子的次数最小. 下面是代码: #include <stdio.h> #include <stdlib.h> struct node

poj 1691 Painting A Board 拓扑序+dfs

题意: 一个木板上被分成了很多区域,每个区域要涂上一种特定的颜色,当涂一个区域的时候,它上方与它有重合部分的区域必须之前要涂好.求最少需要拿几次画笔(拿一次画笔可以涂颜色相同的多个区域). 分析: 上方与它有重合部分的区域必须之前要涂好这个限制可以用拓扑序来描述,每次涂有很多种可以涂的颜色,dfs就可以了.dfs的状态空间维数定为拿笔的次数,每次枚举可以涂的颜色.要注意的是dfs过程中要慎用全局变量..否则每个维度需枚举的东西被下一维改了就跪了... 代码: //poj 1691 //sep9

poj - 1691 - Painting A Board(状态压缩dp)

题意:N(1 <= N <= 15)个矩形,每个矩形要涂上指定的颜色C(1 <= C <= 20),如果给一个矩形涂色,那么与它相邻的上方矩形必须已经涂色,问最少要取几次画笔. 题目链接:http://poj.org/problem?id=1691 -->>状态:dp[S][color] 表示达到状态 S 且最后一次涂色为 color 时的最小取画笔数 状态转移方程:dp[S][color] = min(dp[S][color], dp[sub][i]); 或者 dp[

POJ - 1691 Painting A Board (状态压缩 + 暴力)

题目大意:要将一个大矩形內的所有小矩形涂色,涂色要求,只有该矩形上面的所有矩形都涂色了才可以涂该颜色,换一种填涂的颜色就要花费一点体力值,问填涂完需要花费的最小体力值 解题思路:先处理一下填涂该矩形的前提条件,我用了一个can数组表示填涂该矩形时要满足的状态量 用dp[color][state]表示当前用的颜色是color,填涂的状态为state时所用的最少体力值 然后暴力得出转换和结果 #include<cstdio> #include<cstring> #include<

POJ 题目1691 Painting A Board(DFS)

Painting A Board Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3471   Accepted: 1723 Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat board fully covered by adjacent non-overlapping recta

POJ 1856 Sea Battle(dfs)

Description During the Summit, the armed forces will be highly active. The police will monitor Prague streets, the army will guard buildings, the Czech air space will be full of American F-16s. Moreover, the ships and battle cruisers will be sent to

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

POJ 1564 Sum It Up (DFS+剪枝)

 Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5820   Accepted: 2970 Description Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t = 4