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. 

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: 
  1. Color-code is an integer in the range of 1 .. 20. 
  2. Upper left corner of the board coordinates is always (0,0). 
  3. Coordinates are in the range of 0 .. 99. 
  4. 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
原创粉丝点击