http://poj.org/problem?id=3020
呃。。。这个题不是很会,所以找了大神的博客做了参考,说得很详细
http://blog.csdn.net/lyy289065406/article/details/6647040
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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\n",ID-ma/2) ; } return 0 ; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步