题目大意:将k个鸡放到一个n*m的矩阵中,要求每个鸡所占的rice的个数只差最小
题解:构造,设一共有cnt个rice,可以分cnt/k个,即每一只鸡要么占用cnt/k个rice,要么占cnt/k+1个rice。蛇形跑一边矩阵即可。
注意:要判断当前鸡的个数,即如果当前鸡的个数达到k个,那么放置完毕,鸡的数量不能再增长,而且剩下的格子一定是"."。
#include<bits/stdc++.h> using namespace std; const int N=1E2+7; char arr[N][N]; char mark[N][N]; string s="1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; void solve(){ int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%s",arr[i]+1); int cnt=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(arr[i][j]=='R') cnt++; int x=cnt/k; int a=cnt%k; int pos=1; int sum=0; for(int i=1;i<=n;i++){ if(i&1){ for(int j=1;j<=m;j++){ if(arr[i][j]=='R'){ sum++; if(pos<=k-a){ if(sum<x) mark[i][j]=s[pos]; else { mark[i][j]=s[pos]; if(pos<k) pos++; sum=0; } } else { if(sum<x+1) mark[i][j]=s[pos]; else { mark[i][j]=s[pos]; if(pos<k) pos++; sum=0; } } } else mark[i][j]=s[pos]; } } else { for(int j=m;j>=1;j--){ if(arr[i][j]=='R'){ sum++; if(pos<=k-a){ if(sum<x) mark[i][j]=s[pos]; else { mark[i][j]=s[pos]; if(pos<k) pos++; sum=0; } } else { if(sum<x+1) mark[i][j]=s[pos]; else { mark[i][j]=s[pos]; if(pos<k) pos++; sum=0; } } } else mark[i][j]=s[pos]; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%c",mark[i][j]); } printf("\n"); } } int main(){ int t; scanf("%d",&t); while(t--) solve(); return 0; }