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 1DFS
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 }