标签:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define maxn 50 bool G[maxn][maxn];///重新构图存储 bool vis[maxn];///标记点是否被遍历过 char maps[maxn][maxn];///地图存储 int P[maxn];///第 i 行匹配的第 P[i]列 int n, m, N;///重构图后是m行 n列 struct Node { int x, y; }NodeInfo[maxn][maxn];///保存每个点重构图后所在的行和列 bool Find(int u) { for(int i=0; i<n; i++) { if(G[u][i] && !vis[i]) { vis[i] = true; if( P[i] == -1 || Find(P[i])) { P[i] = u; return true; } } } return false; } void MakeMaps() { m = 0, n = 0;///行标记 和 列标记 for(int i=0; i<N; i++)///第 i 行 { for(int j=0; j<N; j++) { if(maps[i][j] == ‘.‘) NodeInfo[i][j].x = m; if(maps[i][j+1] == ‘X‘ || maps[i][j+1] == 0) m ++; } } for(int i=0; i<N; i++)///第 i 列 { for(int j=0; j<N; j++) { if(maps[j][i] == ‘.‘) NodeInfo[j][i].y = n; if(maps[j+1][i] == ‘X‘ || maps[j+1][i] == 0) n ++; } } for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { int x = NodeInfo[i][j].x; int y = NodeInfo[i][j].y; if(maps[i][j] == ‘.‘) G[x][y] = true; } } } int main() { while(scanf("%d", &N), N) { memset(G, 0, sizeof(G)); memset(P, -1, sizeof(P)); memset(maps, 0, sizeof(maps)); for(int i=0; i<N; i++) scanf("%s", maps[i]); MakeMaps(); int ans = 0; for(int i=0; i<m; i++) { memset(vis, false, sizeof(vis)); if( Find(i) ) ans ++; } printf("%d\n", ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenchengxun/p/4718571.html