• K


    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

    解法:
     1 #include <iostream>
     2 #include<string.h>
     3 #include<stdio.h>
     4 
     5 using namespace std;
     6 
     7 const int MAX = 30 +19;
     8 int Map[MAX][MAX],a[MAX];
     9 int L,W,n;
    10 int pand(int x,int y,int i)
    11 {
    12     if(Map[x-1][y]==i) return 0;
    13     if(Map[x][y-1]==i) return 0;
    14     return 1;
    15 }
    16 int DFS(int x,int y)
    17 {
    18     if(x>L)
    19     return 1;
    20 
    21     for(int i=1;i<=n;i++)
    22     if(((L-x)*W+W-y+2)/2<a[i])
    23     return 0;
    24 
    25     for(int i=1;i<=n;i++)
    26     {
    27         int TX=0;
    28         if(a[i]&&pand(x,y,i)){
    29             Map[x][y]=i;
    30             a[i]--;
    31             if(y==W)
    32             TX = DFS(x+1,1);
    33             else
    34              TX = DFS(x,y+1);
    35             a[i]++;
    36         }
    37         if(TX)
    38             return 1;
    39     }
    40     return 0;
    41 }
    42 int main()
    43 {
    44     int N0=0,N;
    45     cin>>N;
    46     while(N--)
    47     {
    48         memset(a,0,sizeof(a));
    49         memset(Map,0,sizeof(Map));
    50 
    51         cin>>L>>W>>n;
    52         for(int i=1;i<=n;i++)
    53             cin>>a[i];
    54             cout<<"Case #"<<++N0<<":"<<endl;
    55 
    56             if(DFS(1,1))
    57             {
    58                 cout<<"YES"<<endl;
    59                 for(int i=1;i<=L;i++)
    60                 {
    61                     cout<<Map[i][1];
    62                     for(int j=2;j<=W;j++)
    63                     {
    64                         cout<<" "<<Map[i][j];
    65                     }
    66                     cout<<endl;
    67                 }
    68             }
    69             else
    70                     cout<<"NO"<<endl;
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    ♫【插件】插入Flash swfobject
    ☀【Alice】
    _#【Vim】
    _#【选择器】链式class选择器
    _#【HTML】
    _#【CSS】display:inlineblock
    【折叠】一
    图解SSIS自动维护SQL索引
    wininet.dll函数库:检查网络状态
    sqlserver中动态sql语句应用
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7241838.html
Copyright © 2020-2023  润新知