POJ 1691 Painting A Board(dfs搜尋)
一開始感覺暴搜會超時,好像看錯資料範圍了啊、、、發現崔老師dfs過的啊。但是找關係的時候很噁心,x,y不好區分啊,還是看了崔老師的啊。dfs比較好像到就是找所有的如果然道第i次的時候就已經染完了,那就結束了啊。
Painting A Board
Time Limit: 1000MS | Memory Limit: 10000K | |
Total 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
1 7 0 0 2 2 1 0 2 1 6 2 2 0 4 2 1 1 2 4 4 2 1 4 3 6 1 4 0 6 4 1 3 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.1415926535898
using 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;
}
}
相關文章
- 工作安排(dfs深度優先搜尋)
- 【演算法】深度優先搜尋(DFS)演算法
- 【簡單搜尋】POJ 2251 Dugeon MasterAST
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- JAVA圖搜尋演算法之DFS-BFSJava演算法
- 深度優先搜尋演算法-dfs講解演算法
- 《圖論》——深度優先搜尋演算法(DFS)圖論演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 深搜dfs
- 深度優先搜尋(DFS)思路及演算法分析演算法
- BFS廣度優先搜尋(5)(亦可以用DFS)--hdu1241(poj1562)(基礎題)
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- POJ 3411 Paid Roads(搜尋的小技巧)AI
- DFS與BFS——理解簡單搜尋(中文虛擬碼+例題)
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 學習資料結構 - 深度優先搜尋 DFS 記錄資料結構
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- POJ 1753-Flip Game(列舉&&DFS)GAM
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- POJ3279 Fliptile【狀態壓縮+DFS】
- POJ 1579-Function Run Fun(記憶化搜尋-遞迴)Function遞迴
- BFS廣度優先搜尋(6)--poj3414(基礎題)
- 海量資料搜尋---搜尋引擎
- 搜尋引擎-03-搜尋引擎原理
- BFS廣度優先搜尋(4)--hdu2717(poj3278)(基礎題)
- poj1179 區間dp(記憶化搜尋寫法)有巨坑!
- POJ 3321 Apple Tree(dfs+樹狀陣列)APP陣列
- POJ 1699 二進位制表示狀態+dfs
- 搜尋引擎es-分詞與搜尋分詞
- elasticsearch搜尋Elasticsearch
- 字串搜尋字串
- vim搜尋
- 搜尋策略
- POJ3321 Apple Tree(DFS序 + 樹狀陣列)APP陣列
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch
- DFS深度優先搜尋(3)--hdu2181(哈密頓繞行世界問題)(基礎題)
- BFS廣度優先搜尋(3)--poj2251(zoj1940)(基礎題)