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:\nYES\n",cas++);
17     for(int i=1;i<=n;i++)
18         for(int j=1;j<=m;j++)
19                   printf(j==m?"%d\n":"%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:\nNO\n",cas++); continue;}
57         flag = 0;
58         dfs(1,1);
59     }
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/darkboy/p/9398158.html