UVA - 10615 Rooks
建一下模,把行和列看成二分图的点,把车看成是二分图中的边,这样就变成了上一个博客的问题。
我们每次新加一条边,就把它加入一条 这条边两端点最小没有出现的颜色 交替出现的路径中去。
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=105; int T,n,m,G[maxn][maxn],cnt; int dy[2][maxn][maxn],ans,C[2]; char s[maxn][maxn]; inline void init(){ cnt=ans=0; memset(dy,0,sizeof(dy)); memset(G,0,sizeof(G)); } void dfs(int a,int b,int x,int y,int now,int pre){ if(now==pre) dy[a][x][now]=y,dy[b][y][now]=x; else{ int to=dy[b][y][now]; dy[a][x][now]=y,dy[b][y][now]=x; if(!to) dy[b][y][pre]=0; else dfs(b,a,y,to,pre,now); } } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n),init(); for(int i=1;i<=n;i++){ scanf("%s",s[i]+1); for(int j=1;j<=n;j++) if(s[i][j]=='*') G[i][j]=++cnt; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(G[i][j]){ C[0]=C[1]=1; while(dy[0][i][C[0]]) C[0]++; while(dy[1][j][C[1]]) C[1]++; ans=max(ans,max(C[0],C[1])); dfs(0,1,i,j,C[0],C[1]); } printf("%d\n",ans); memset(G,0,sizeof(G)); for(int i=1;i<=n;i++) for(int j=1;j<=ans;j++) if(dy[0][i][j]) G[i][dy[0][i][j]]=j; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) printf("%d ",G[i][j]); puts(""); } } return 0; }
我爱学习,学习使我快乐