题意:给一个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 }