POJ【1691】——Painting A Board

Painting A Board

Time Limit: 1000MS Memory Limit: 10000K

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.
POJ【1691】——Painting A Board_第1张图片
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:

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

Source

Tehran 1999

题意:给你一些矩阵,每一次你需要将矩阵凃上染色,但是上面的矩阵的染色会影响下面矩阵的染色,求改变最少的次数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

typedef struct node
{
    int x1,y1,x2,y2,op;
}No;

No a[20];


bool mp[20][20];

int Du[20];

bool vis[20];

int ans ;

int n;

void dfs(int u,int op,int num)
{
    if(num == n) 
    {
        ans = min(ans,op);

        return ;
    }

    if(op>ans) return ;

    for(int  i =1;i<=n;i++)
    {
        if(mp[u][i])
        {
            Du[i]--;
        }
    }

    for(int i = 1;i<=n;i++)
    {
        if(!vis[i] && Du[i] ==0)
        {
            vis[i] = true;
            if(a[i].op == a[u].op)
            {
                dfs(i,op,num+1);
            }
            else 
            {
                dfs(i,op+1,num+1);
            }

            vis[i] = false;
        }
    }

    for(int i = 1;i<=n;i++)
    {
        if(mp[u][i])
        {
            Du[i]++;
        }
    }
}

int main()
{
    int T;


    scanf("%d",&T);

    while(T--)
    {
        scanf("%d",&n);

        for(int i = 1;i<=n;i++)
        {
            scanf("%d %d %d %d %d",&a[i].y1,&a[i].x1,&a[i].y2,&a[i].x2,&a[i].op);
        }

        memset(mp,false,sizeof(mp));

        memset(Du,0,sizeof(Du));

        for(int i  = 1;i<=n;i++)
        {
            for(int j = 1;j<=n;j++)
            {
                if(i == j) continue;

                if(a[j].y1 != a[i].y2) continue;

                if((a[j].x1 >= a[i].x1 && a[j].x1>a[i].x2) ||(a[j].x1<=a[i].x1 && a[j].x2>=a[i].x2) || (a[j].x2>a[i].x1 &&a[j].x2<=a[i].x2))
                {
                    mp[i][j] = true;

                    Du[j]++;
                }
            }
        }

        memset(vis,false,sizeof(vis));

        ans = n+1;

        for(int i  =1;i<=n;i++)
        {
            if(Du[i] == 0)
            {
                vis[i] = true;
                dfs(i,1,1);

                vis[i] = false;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(POJ【1691】——Painting A Board)