• Black And White (DFS 训练题)


              G - Black And White

    =========================================================================================================================
    数据范围很小,可以直接用DFS深搜出结果,,但如果不把数据 按升序排好序 就去进行深搜的话,会超时,优先让数量最多的放在前面
    然后 如果有一个数字的数量  > (M×N+1)/2 则肯定 输出 NO;因为怎么也不可能不相邻;
    设DFS(int y ,int x) 即对这个格子进行染色
    =========================================================================================================================
    代码:
     1 #include <algorithm>
     2 #include <cstdio>
     3 using namespace std;
     4 
     5 int Map[30][30];
     6 int n,m,k,cas=1; //行,列,数量,案例几
     7 int flag = 0;    //判定dfs return条件
     8 
     9 struct Node{
    10   int num,s;  //颜色编号,该颜色数量
    11 }tail[40];      
    12 bool cmp(Node a,Node b) { return a.s>b.s;}
    13 
    14 void print() //输出函数
    15 {
    16     printf("Case #%d:
    YES
    ",cas++);
    17     for(int i=1;i<=n;i++)
    18         for(int j=1;j<=m;j++)
    19                   printf(j==m?"%d
    ":"%d ",Map[i][j]);
    20 }
    21 
    22 void dfs(int y,int x)
    23 {
    24     for(int i =1;i<=k;++i)
    25         if(flag==1) return;  
    26         else if(tail[i].s)
    27         {
    28             if(Map[y-1][x]!=tail[i].num&&Map[y][x-1]!=tail[i].num)
    29             {
    30                 --tail[i].s;           //改颜色数量-1;
    31                 Map[y][x] = tail[i].num;
    32                 if(y==n&&x==m&&flag!=1) 
    33                     {flag = 1;print();return;} //如果格子填充完了,则输出
    34                 else if(x==m)                //如果这一行填充完了,跳转至下一行
    35                     dfs(y+1,1);
    36                 else                      //否则前往这一行的下一个格子
    37                     dfs(y,x+1);
    38                 ++tail[i].s;
    39             }
    40         }
    41 }
    42 int main()
    43 {
    44     int T;
    45     scanf("%d",&T);
    46 
    47     for(int num = 1;num<=T;++num)
    48     {
    49         scanf("%d %d %d",&n,&m,&k);
    50         for(int i = 1;i<=k;++i)
    51         {
    52             scanf("%d",&tail[i].s);
    53             tail[i].num = i;
    54         }
    55         sort(tail+1,tail+k+1,cmp); 
    56         if(tail[1].s>(n*m+1)/2) {printf("Case #%d:
    NO
    ",cas++); continue;}
    57         flag = 0;
    58         dfs(1,1);
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    随笔 Frida
    [转]某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人 第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人 求第N天共有多少患者 Frida
    sql 将具有相同ID的多条记录组合成一条记录 Frida
    【转】小谈C#.NET下的爬虫(蜘蛛)技术 Frida
    ECMAScript基础1 Frida
    显示隐藏层 jquery Frida
    SQL语句备份和还原数据库
    Hello!Blog~
    23个MySQL常用查询语句
    SQL Server 2008压缩数据库日志文件
  • 原文地址:https://www.cnblogs.com/darkboy/p/9398158.html
Copyright © 2020-2023  润新知