题目大意:将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;
}