POJ 1691 Painting A Board(dfs搜索)
来源:互联网 发布:阿里云必须备案吗 编辑:程序博客网 时间:2024/05/17 23:57
一开始感觉暴搜会超时,好像看错数据范围了啊、、、发现崔老师dfs过的啊。但是找关系的时候很恶心,x,y不好区分啊,还是看了崔老师的啊。dfs比较好像到就是找所有的如果然道第i次的时候就已经染完了,那就结束了啊。
Painting A Board
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 3261 Accepted: 1599
Description
The CE digital company has built an Automatic Painting Machine (APM) to paint a flat board fully covered by adjacent non-overlapping rectangles of different sizes each with a predefined color.
To color the board, the APM has access to a set of brushes. Each brush has a distinct color C. The APM picks one brush with color C and paints all possible rectangles having predefined color C with the following restrictions:
To avoid leaking the paints and mixing colors, a rectangle can only be painted if all rectangles immediately above it have already been painted. For example rectangle labeled F in Figure 1 is painted only after rectangles C and D are painted. Note that each rectangle must be painted at once, i.e. partial painting of one rectangle is not allowed.
You are to write a program for APM to paint a given board so that the number of brush pick-ups is minimum. Notice that if one brush is picked up more than once, all pick-ups are counted.
To color the board, the APM has access to a set of brushes. Each brush has a distinct color C. The APM picks one brush with color C and paints all possible rectangles having predefined color C with the following restrictions:
To avoid leaking the paints and mixing colors, a rectangle can only be painted if all rectangles immediately above it have already been painted. For example rectangle labeled F in Figure 1 is painted only after rectangles C and D are painted. Note that each rectangle must be painted at once, i.e. partial painting of one rectangle is not allowed.
You are to write a program for APM to paint a given board so that the number of brush pick-ups is minimum. Notice that if one brush is picked up more than once, all pick-ups are counted.
Input
The first line of the input file contains an integer M which is the number of test cases to solve (1 <= M <= 10). For each test case, the first line contains an integer N, the number of rectangles, followed by N lines describing the rectangles. Each rectangle R is specified by 5 integers in one line: the y and x coordinates of the upper left corner of R, the y and x coordinates of the lower right corner of R, followed by the color-code of R.
Note that:
Note that:
- Color-code is an integer in the range of 1 .. 20.
- Upper left corner of the board coordinates is always (0,0).
- Coordinates are in the range of 0 .. 99.
- N is in the range of 1..15.
Output
One line for each test case showing the minimum number of brush pick-ups.
Sample Input
170 0 2 2 10 2 1 6 22 0 4 2 11 2 4 4 21 4 3 6 14 0 6 4 13 4 6 6 2
Sample Output
3
#include <algorithm>#include <iostream>#include <stdlib.h>#include <string.h>#include <iomanip>#include <stdio.h>#include <string>#include <queue>#include <cmath>#include <stack>#include <map>#include <set>#define eps 1e-7#define M 1000100///#define LL __int64#define LL long long#define INF 0x3fffffff#define PI 3.1415926535898using namespace std;const int maxn = 110;struct node{ int x1, y1; int x2, y2; int c;} f[maxn];int n;int vis[maxn];vector<int>g[maxn];int judge1(int x, int y){ if(f[x].x2 <= f[y].x1) { if(f[x].y1 < f[y].y2 && f[x].y1 > f[y].y1) return 1; else if(f[x].y2 < f[y].y2 && f[x].y2 > f[y].y1) return 1; else if(f[y].y1 < f[x].y2 && f[y].y1 > f[x].y1) return 1; else if(f[y].y2 < f[x].y2 && f[y].y2 > f[x].y1) return 1; else if(f[y].y1 == f[x].y1 && f[x].y2 == f[y].y2) return 1; else return 0; } return 0;}int judge2(int x){ int i; int k = g[x].size(); for(i = 0; i < k; i++) if(!vis[g[x][i]]) break; if(i == k) return 1; return 0;}int dfs(int x, int c, int step){ if( x < 0) return 0; if(step > n) return 1; for(int i = 1; i <= n; i++) { int flag = judge2(i); if(!vis[i] && flag && f[i].c == c) { vis[i] = 1; if(dfs(x, c, step+1)) return 1; vis[i] = 0; } else if(!vis[i] && flag && f[i].c != c) { vis[i] = 1; if(dfs(x-1, f[i].c, step+1)) return 1; vis[i] = 0; } } return 0;}int main(){ int T; cin >>T; while(T--) { cin >>n; for(int i = 0; i <= n; i++) g[i].clear(); for(int i = 1; i <= n; i++) cin >>f[i].x1>>f[i].y1>>f[i].x2>>f[i].y2>>f[i].c; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i != j) if(judge1(i, j)) g[j].push_back(i); int i; for(i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if(dfs(i, 0, 1)) break; } cout<<i<<endl; }}
0 0
- POJ 1691 Painting A Board(dfs搜索)
- 【POJ 1691】 Painting A Board(dfs)
- [POJ 1691]Painting A Board[DFS][排序]
- poj 1691 Painting A Board (构图 DFS)
- POJ 题目1691 Painting A Board(DFS)
- (POJ 1691)Painting A Board <top序列 + DFS>
- POJ 1691 Painting A Board (DFS/状态DP)
- poj 1691 Painting A Board (拓扑排序+dfs)
- poj 1691 Painting A Board(dfs,拓扑排序)
- poj 1691 Painting A Board 拓扑序+dfs
- [poj 1691] Painting A Board dfs+拓扑排序
- POJ 1691 Painting A Board
- poj 1691 Painting A Board
- poj 1691 Painting A Board
- POJ 1691 Painting A Board
- POJ 1691 Painting A Board
- 【poj 1691】Painting A Board
- POJ-1691 Painting A Board
- About RFID
- 解开移动广告平台的外衣
- Android中资源文件的使用(二):主题和样式
- C/C++运算符优先级
- 网络时延RTT介绍
- POJ 1691 Painting A Board(dfs搜索)
- Android开发上的一些规范
- (C#)利用反射动态调用类成员[转载]
- Nginx配置文件详细说明
- 工具others
- lcd 驱动
- java开发中常用的开发工具-重要性
- json和php数组 格式的互相转换
- linux SCREEN 命令