RCC 2017 Qual 1 Mail.Ru, April 2, 2017 Problem B. Painting the Wall

题意:给一个n*m(<=100)的图,图中0表示台灯,1表示空地,以台灯和墙作为边界,问能否使用k种使得联通的线段上没有重复的颜色

分析:只要连续的空地不超过k个就必然存在一个解,可以选择如下构造,假设n=5,m=5,k=3

1 2 3 1 2

2 3 1 2 3

3 1 2 3 1

1 2 3 1 2

2 3 1 2 3

这样,把灯的位置都换为0,如果检测到没有连续的超过k的线段,那么这就是一个可行解

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e2+5;
 4 int g[maxn][maxn],res[maxn][maxn];
 5 int t,n,m,k;
 6 
 7 void init(){
 8     for(int i=1;i<=n;i++){
 9         res[i][1]=(res[i-1][1]+1)%k;
10         for(int j=2;j<=m;j++)res[i][j]=(res[i][j-1]+1)%k;
11     }
12 }
13 
14 void print(int x,int y){
15     if(!g[x][y])cout<<0;
16     else cout<<res[x][y]+1;
17 }
18 
19 int main(){
20      int t;cin>>t;
21      while(t--){
22          cin>>n>>m>>k;init();
23          
24          for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
25              cin>>g[i][j];
26              if(!g[i][j])res[i][j]=0;
27          }
28          
29          bool flag=1;
30          
31          for(int i=1;i<=n;i++){
32              int j=1;
33              for(;j<=m;j++){
34                  int cnt=0;
35                  while(j<=m&&g[i][j])cnt++,j++;
36                  if(cnt>k){flag=0;break;}
37              }
38          }
39          
40          for(int i=1;i<=m;i++){
41              int j=1;
42              for(;j<=n;j++){
43                  int cnt=0;
44                  while(j<=n&&g[j][i])cnt++,j++;
45                  if(cnt>k){flag=0;break;}
46              }
47          }
48          if(!flag){puts("NO");continue;}
49          puts("YES");
50          
51          for(int i=1;i<=n;i++){
52              print(i,1);
53              for(int j=2;j<=m;j++)cout<<" ",print(i,j);
54              cout<<endl;
55          }
56      }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/jihe/p/6673240.html