#include <cstdio>
#include <cstring>
using namespace std;
int g[33][33],linky[33];
bool vis[33];
char map[5][5];
int mapl[5][5],mapr[5][5];
int n , m;
bool find(int u) {
    for(int v=1;v<=m;v++) 
        if(g[u][v] && !vis[v]) {
            vis[v] = 1;
            if(linky[v]==-1 || find(linky[v])) {
                linky[v] = u;
                return true;    
            }    
        } 
    return false;
}
int hungry() {
    int ret = 0;
    memset(linky,-1,sizeof(linky));
    for(int u=1;u<=n;u++) {
        memset(vis,0,sizeof(vis));
        if(find(u)) ret ++;   
    }    
    return ret;
}
int main() {
    int N;
    while(~scanf("%d",&N) && N) {
        memset(mapl,0,sizeof(map));
        memset(mapr,0,sizeof(mapr));
        for(int i=0;i<N;i++) scanf("%s",map[i]);
        n = m = 0;
        for(int i=0;i<N;i++)
        for(int j=0;j<N;j++) 
            if(map[i][j] == 'X') mapl[i][j] = mapr[i][j] = -1;
        for(int i=0;i<N;i++)
        for(int j=0;j<N;j++) {
            while(mapr[i][j]==-1&&j<N) j++;
            n ++;
            while(mapr[i][j]!=-1&&j<N) mapr[i][j++] = n;    
        }
        for(int i=0;i<N;i++)
        for(int j=0;j<N;j++) {
            while(mapl[j][i]==-1&&j<N) j++;
            m ++;
            while(mapl[j][i]!=-1&&j<N) mapl[j++][i] = m;    
        }
        memset(g,0,sizeof(g));
        for(int i=0;i<N;i++)
        for(int j=0;j<N;j++) {
            if(mapr[i][j]!=-1&&mapl[i][j]!=-1) g[mapr[i][j]][mapl[i][j]] = 1;    
        }
        int ans = hungry();
        printf("%d\n",ans);
    }
    return 0;    
}
	posted on 2012-10-22 05:03 
YouAreInMyHeart 阅读(172) 
评论(0)  编辑 收藏 引用