Black And White (dfs + 剪枝)

Black And White

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 527    Accepted Submission(s): 145
Special Judge

Problem Description

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 ci cells.

Matt hopes you can tell him a possible coloring.

Input

The 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 ci (ci > 0), denoting the number of cells where the i-th color should be used.

It’s guaranteed that c1 + c2 + · · · + cK = N × M .

Output

For 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

·学习傅总思路打出来的代码,基本相同。

  http://fudq.blog.163.com/blog/static/191350238201411271332692/

·一直还是比较怕dfs的,我只能说,,,练吧。。。。

·这题的剪枝也是醉了,现场想到了,加的位置不对还是没过,,,不知道是否是出题者故意的,,如果是就太神了。。

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <string.h>
 6 #include <math.h>
 7 #include <queue>
 8 #include <stack>
 9 #include <stdlib.h>
10 #include <map>
11 using namespace std;
12 #define LL long long
13 #define sf(a) scanf("%d",&(a));
14
15 #define N 21
16 int r[N][N];
17 int n,m,flag,k;
18 int f[10010];
19 //染色:  dfs,深搜 + 剪枝
20
21
22 void Output(){
23     printf("YES\n");
24     for(int i=1;i<=n;i++){
25         //if(i==0) printf("%d",r[i][0]);
26         for(int j=1;j<=m;j++)
27             if(j==1)
28                 printf("%d",r[i][j]+1);
29             else printf(" %d",r[i][j]+1);
30         printf("\n");
31     }
32 }
33 int jud(int x,int y,int i){
34     if(r[x-1][y] == i) return 0;
35     if(r[x][y-1] == i) return 0; //表示此种方式不行!
36     return 1;
37 }
38 void dfs(int x,int y,int cnt){
39     if(flag) return ;
40     if(cnt == 0){
41         flag=1;
42         Output();
43         return ;
44     }
45     //加上剪枝
46     for(int i=0;i<k;i++){
47         if(f[i] > (cnt+1)/2) return ; //直接返回,此时不成功!
48     }
49     for(int i=0;i<k;i++){
50         if(f[i] && jud(x,y,i)){
51             r[x][y] = i;
52             f[i]--;
53             if(y==m) dfs(x+1,1,cnt-1);
54             else dfs(x,y+1,cnt-1);
55             r[x][y]=-1;
56             f[i]++;
57         }
58     }
59
60 }
61 int main(){
62     int T,cas=1;
63     scanf("%d",&T);
64     while(T--){
65         printf("Case #%d:\n",cas++);
66         scanf("%d %d %d",&n,&m,&k);
67         flag=0;
68         for(int i=0;i<k;i++) scanf("%d",&f[i]);
69         memset(r,-1,sizeof(r));
70         dfs(1,1,n*m);
71         if(!flag) printf("NO\n");
72     }
73
74     return 0;
75 }
时间: 2024-10-13 17:53:40

Black And White (dfs + 剪枝)的相关文章

HDOJ 5113 Black And White DFS+剪枝

DFS+剪枝... 在每次DFS前,当前棋盘的格子数量的一半小于一种颜色的数量时就剪掉 Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 194    Accepted Submission(s): 50 Special Judge Problem Description In mathematics,

hdu5113 Black And White(dfs+剪枝)

题目链接:点击打开链接 题意描述:给一个n*m的棋盘,现在有k种颜色的涂料,每种涂料可以使用ai次.求能否找出一种方案,给所有的格子染色,保证相邻的格子之间颜色不同.如果存在给出任意一种解决方案:否则输出NO 解题思路:dfs+剪枝 由于题目中棋盘最大为5×5所以可以考虑使用dfs,染色问题有一个结论貌似是:(剩余的格子的数量+1)>= 任意一种涂料的个数,否则染色必然失败.因此我们可以通过这个性质进行剪枝,此题如果不剪枝会TLE 代码: #include <cstdio> #inclu

[HDU 5113] Black And White (dfs+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:给你N*M的棋盘,K种颜色,每种颜色有c[i]个(sigma(c[i]) = N*M),现在给棋盘染色,使得相邻的两个棋盘染成不同的颜色,并且把所有颜色用完. 因为棋盘最大为5*5的,因此可以考虑搜索+剪枝. 从左到右,从上到下看当前格子能够染成什么颜色. 有一个限制性条件,就是说如果当前棋盘的格子数量的一半小于一种颜色的数量时,那么就一定有两个相邻的棋盘被染成了相同的颜色. 因为假

ZOJ 1008 Gnome Tetravex (DFS + 剪枝)

Gnome Tetravex 题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8 题意:有N*N个方格,每个方格分为上下左右四个部分,每个部分填数字.现在要求重排方块,使得每两个有边相连的方块对应的数字相同. 思路:就是一个简单的搜索,我想了个剪枝,将上下左右四个方向上每个数字对应的是哪几个方块记录下来,但是这个剪枝并没有起很大的作用,还是T了.后来才发现,如果有很多个方块是相同的,会重复搜索,所以需要将相同的方块一起处

UVA 10318 - Security Panel dfs 剪枝

UVA 10318 - Security Panel dfs 剪枝 ACM 题目地址:UVA 10318 - Security Panel 题意: 这题跟点灯的题目很像,点灯游戏选择一盏灯时会让它以及四周的灯改变状态. 但是我们有特殊的开开关技巧,它给出了改变状态的位置,而不是四周都改变. 问你从全部关着变成全部开着的最小开关步骤. 分析: 很明显,在一个位置上点两次或更多次是没有必要的,所以一个位置只有选择与不选择,用dfs即可,但如果暴力所有可能,复杂度是2^25,会超时,所以要剪枝. 由于

Cubes(DFS+剪枝)

题意:给一个数N,求N最少由多少个数的立方构成,并输出这些数. 做法:DFS + 剪枝,剪枝的边界很很很重要! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <stdio.h> int cub[400]; int ans[300]; int tp[300]; int n; int sum = 0x3f3f3f3f; //个数 void dfs(int le

hdu 4109 dfs+剪枝优化

求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己增加的)出发,0到1~n个节点之间的距离为1,mt[i]表示从0点到第i个节点目前所得的最长路径 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; const

POJ 1564 Sum It Up (DFS+剪枝)

 Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5820   Accepted: 2970 Description Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t = 4

EOJ1981 || POJ1011 经典dfs+剪枝+奇怪的数据

题目:EOJ1981 || POJ1011   经典dfs+剪枝+奇怪的数据 Description George took sticks of the same length and cut them randomly until all partsbecame at most 50 units long. Now he wants to return sticks to the originalstate, but he forgot how many sticks he had origi