• Black And White HDU


    In mathematics, the four color theorem, or the four color map theorem, states that, given any separation of a plane into contiguous regions, producing a figure called a map, no more than four colors are required to color the regions of the map so that no two adjacent regions have the same color. 
    — Wikipedia, the free encyclopedia 

    In this problem, you have to solve the 4-color problem. Hey, I’m just joking. 

    You are asked to solve a similar problem: 

    Color an N × M chessboard with K colors numbered from 1 to K such that no two adjacent cells have the same color (two cells are adjacent if they share an edge). The i-th color should be used in exactly c i cells. 

    Matt hopes you can tell him a possible coloring.

    InputThe first line contains only one integer T (1 ≤ T ≤ 5000), which indicates the number of test cases. 

    For each test case, the first line contains three integers: N, M, K (0 < N, M ≤ 5, 0 < K ≤ N × M ). 

    The second line contains K integers c i (c i > 0), denoting the number of cells where the i-th color should be used. 

    It’s guaranteed that c 1 + c 2 + · · · + c K = N × M . 
    OutputFor each test case, the first line contains “Case #x:”, where x is the case number (starting from 1). 

    In the second line, output “NO” if there is no coloring satisfying the requirements. Otherwise, output “YES” in one line. Each of the following N lines contains M numbers seperated by single whitespace, denoting the color of the cells. 

    If there are multiple solutions, output any of them.Sample Input

    4
    1 5 2
    4 1
    3 3 4
    1 2 2 4
    2 3 3
    2 2 2
    3 2 3
    2 2 2

    Sample Output

    Case #1:
    NO
    Case #2:
    YES
    4 3 4
    2 1 2
    4 3 4
    Case #3:
    YES
    1 2 3
    2 3 1
    Case #4:
    YES
    1 2
    2 3
    3 1
    DFS
     1 #include <iostream>
     2 using namespace std;
     3 #include<string.h>
     4 #include<set>
     5 #include<stdio.h>
     6 #include<math.h>
     7 #include<queue>
     8 #include<map>
     9 #include<algorithm>
    10 #include<queue>
    11 int a[30][30],yanse[30];
    12 int lenx,leny,yanseshu;
    13 int flag=0;
    14 int b[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    15 int panduan(int x,int y,int k)
    16 {
    17     if(a[x-1][y]==k) return 0;
    18     if(a[x][y-1]==k) return 0;
    19     return 1;
    20 }
    21 int dfs(int x,int y)
    22 {
    23     if(x>leny)
    24     return 1;
    25     int shengyu=(leny-x)*lenx+lenx-y+2;
    26     for(int i=1;i<=yanseshu;i++)
    27     if(shengyu/2<yanse[i])
    28     return 0;
    29     for(int i=1;i<=yanseshu;i++)
    30     {
    31         int f=0;
    32         if(yanse[i]&&panduan(x,y,i)){
    33             a[x][y]=i;
    34             yanse[i]--;
    35             if(y==lenx)
    36             f=dfs(x+1,1);
    37             else
    38              f=dfs(x,y+1);
    39             yanse[i]++;
    40         }
    41         if(f)
    42             return 1;
    43     }
    44     return 0;
    45 }
    46 int main()
    47 {
    48     int add=0,t;
    49     cin>>t;
    50     while(t--)
    51     {
    52         memset(a,0,sizeof(a));
    53         memset(yanse,0,sizeof(yanse));
    54         cin>>leny>>lenx>>yanseshu;
    55         for(int i=1;i<=yanseshu;i++)
    56             cin>>yanse[i];
    57             cout<<"Case #"<<++add<<":"<<endl;
    58             flag=0;
    59             if(dfs(1,1))
    60             {
    61                 cout<<"YES"<<endl;
    62                 for(int i=1;i<=leny;i++)
    63                 {
    64                     for(int j=1;j<=lenx;j++)
    65                     {
    66                         if(j==lenx)
    67                         {
    68                             cout<<a[i][j];
    69                             continue;
    70                         }
    71                         cout<<a[i][j]<<' ';
    72                     }
    73                     cout<<endl;
    74                 }
    75             }
    76             else
    77                     cout<<"NO"<<endl;
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    mssql分页原理及效率分析
    [ActiveX]使用VS2010创建MFC ActiveX工程项目
    Study notes for Discrete Probability Distribution
    oracle存储过程异常捕获
    (Python学习9)Python虚拟机中的一般表达式
    用Arduino做一个可视化网络威胁级别指示器!
    iOS上线项目源码分享
    android实习程序6——拨号通话
    评价等级使用的五星选择,包含半星的选择
    AJAX实现无刷新验证用户名
  • 原文地址:https://www.cnblogs.com/dulute/p/7272693.html
Copyright © 2020-2023  润新知