题目链接:http://codeforces.com/contest/1255/problem/D
题目大意:
有k只鸡,n*m的地,然后有几块地是有米的。每只鸡占领的地是连续的,要让占领的有米的地最多的-占领有米的地最少的差最小。
思路:差值肯定是0或1,如果有米的地的数量是鸡的倍数那差值就是0,否则就是1。然后只要横着遍历S型或者竖着遍历S型就可以了。我采用的是横着遍历。
#include<bits/stdc++.h>
using namespace std;
string s[110];
char ans[110][110];
int main()
{
ios::sync_with_stdio(false);
int T,r,c,k,i,j,K;
cin>>T;
while(T--)
{
int sum=0;
cin>>r>>c>>k;K=k;
for(i=0;i<r;i++)
{
cin>>s[i];
for(j=0;j<c;j++)
if(s[i][j]=='R')sum++;
}
int cc=sum%k;
int C=sum/k;
int posi=0,posj=0;
int num=-1;
char ch;
k-=cc;
while(cc)
{
num++;
if(num<10)ch='0'+num;
else if(num>=10&&num<=35)ch='A'+num-10;
else ch='a'+num-36;
int z=0;
for(i=posi;i<r;i++)
{
if(i&1)
{
for(j=posj;j>=0;j--)
{
if(s[i][j]=='R')z++;
ans[i][j]=ch;
if(z==C+1)break;
}
}
else
{
for(j=posj;j<c;j++)
{
if(s[i][j]=='R')z++;
ans[i][j]=ch;
if(z==C+1)break;
}
}
if(z==C+1)break;
if(i&1)posj=0;
else posj=c-1;
}
posi=i;
if(posi&1)
{
posj=j-1;
if(posj==-1)
{
posi++;
posj=0;
}
}
else
{
posj=j+1;
if(posj==c)
{
posi++;
posj=c-1;
}
}
cc--;
if(cc==0)break;
}
while(k)
{
num++;
if(num<10)ch='0'+num;
else if(num>=10&&num<=35)ch='A'+num-10;
else ch='a'+num-36;
int z=0;
for(i=posi;i<r;i++)
{
if(i&1)
{
for(j=posj;j>=0;j--)
{
if(s[i][j]=='R')z++;
ans[i][j]=ch;
if(z==C)break;
}
}
else
{
for(j=posj;j<c;j++)
{
if(s[i][j]=='R')z++;
ans[i][j]=ch;
if(z==C)break;
}
}
if(z==C)break;
if(i&1)posj=0;
else posj=c-1;
}
posi=i;
if(posi&1)
{
posj=j-1;
if(posj==-1)
{
posi++;
posj=0;
}
}
else
{
posj=j+1;
if(posj==c)
{
posi++;
posj=c-1;
}
}
k--;
if(k==0)break;
}
num=K-1;
if(num<10)ch='0'+num;
else if(num>=10&&num<=35)ch='A'+num-10;
else ch='a'+num-36;
for(i=posi;i<r;i++)
{
if(i&1)
{
for(j=posj;j>=0;j--)
ans[i][j]=ch;
}
else
{
for(j=posj;j<c;j++)
ans[i][j]=ch;
}
if(i&1)posj=0;
else posj=c-1;
}
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
cout<<ans[i][j];
cout<<endl;
}
}
}