http://poj.org/problem?id=3020
呃。。。这个题不是很会,所以找了大神的博客做了参考,说得很详细
http://blog.csdn.net/lyy289065406/article/details/6647040
#include <stdio.h> #include <iostream> #include <string.h> using namespace std ; const int maxn = 450 ; int map[maxn][maxn] ; int ID ; int v1,v2 ; int ma ; bool city[maxn][maxn] ; bool vist[maxn] ; int link[maxn] ; int dirr[4] = {-1,1,0,0} ; int dirc[4] = {0,0,-1,1} ; bool dfs(int x) { for(int i = 1 ; i <= v2 ; i++) { if(city[x][i] && !vist[i]) { vist[i] = true ; if(link[i] == 0 || dfs(link[i])) { link[i] = x ; return true ; } } } return false ; } void sea() { for(int i = 1 ; i <= v1 ; i++) { memset(vist, 0,sizeof(vist)) ; if(dfs(i)) ma++ ; } return ; } int main() { int t ; scanf("%d",&t) ; while(t--) { memset(map,0,sizeof(map)) ; memset(city,0,sizeof(city)) ; memset(link,0,sizeof(link)) ; ID = 0 ; ma = 0 ; int h,w ; scanf("%d %d",&h,&w) ; char temp ; for(int i = 1 ; i <= h ; i++) { for(int j = 1 ; j <= w ; j++) { cin>>temp ; if(temp == '*') map[i][j] = ++ ID ; } } for(int i = 1 ; i <= h ; i++) { for(int j = 1 ; j <= w ; j++) { if(map[i][j]) { for(int k = 0 ; k < 4 ; k++) { int x = i+dirr[k] ; int y = j+dirc[k] ; if(map[x][y]) city[map[i][j]][map[x][y]] = true ; } } } } v1 = v2 = ID ; sea() ; printf("%d ",ID-ma/2) ; } return 0 ; }