#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int xx[160],vis[160],g[160][160],d1[160],d2[160],n,res[160][160];
char s[160][160];
int match(int u){
for(int i=1;i<=n;i++){
if(!vis[i] && g[u][i]){
vis[i]=1;
if(!xx[i] || match(xx[i])){
xx[i]=u;
return 1;
}
}
}
return 0;
}
void solve(int c){
memset(xx,0,sizeof(xx));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
match(i);
}
for(int i=1;i<=n;i++){
if(xx[i]){
int u=xx[i];
if(s[u][i]=='*'&&!res[u][i])
res[u][i]=c;
g[u][i]--;
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
memset(g,0,sizeof(g));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(s[i][j]=='*'){
d1[i]++;
d2[j]++;
g[i][j]++;
}
}
}
int tm=0;
for(int i=1;i<=n;i++){
tm=max(tm,max(d1[i],d2[i]));
}
printf("%d\n",tm);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
while(d1[i]<tm && d2[j]<tm){
d1[i]++;
d2[j]++;
g[i][j]++;
}
}
}
memset(res,0,sizeof(res));
for(int i=1;i<=n;i++)
solve(i);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%d%c",res[i][j],j==n?'\n':' ');
}
}
}
uva 10615 二分图匹配 每个点上的不同边必须染上不同颜色 求最小染色数
最新推荐文章于 2022-11-28 07:00:00 发布