现有一个n*m的矩阵方格和1*2、2*1两种积木。矩阵中有些格子是不能放积木的,摆放的积木是不能互相重合的,当然,积木也不能放到矩阵外面。问,这个矩阵,最多能放多少积木?
多组输入,每组第一行有两个整数n、m,表示矩阵有n行,m列。(1<=n,m<=10) 接下来,会有n行字符串,每行有m个字符。字符只会是‘.’ 或‘*’, ‘*’表示这个格子不能放积木,‘.’表示这个格子可以放积木。
每组输出一行,这行包含一个数字,表示这个矩阵最多放的积木数量。
5 2 .* .. .* .. *.
3
代码如下:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <ctime>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <map>#include <set>#include <string>#define OUT(x) cout << #x << ": " << (x) << endlusingnamespacestd;constintmmax=200;constintinf=0x3fffffff;boolG[mmax][mmax];chartt[mmax][mmax];intdir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};boolvis[mmax];intlink[mmax];intn,m;boolfind(intx){for(inti=1;i<=n*m;i++){if(G[x][i] && !vis[i]){vis[i]=true;if(link[i]==0 || find(link[i])){link[i]=x;returntrue;}}}returnfalse;}intmain(){while(scanf("%d %d",&n,&m)!=EOF){memset(G,false,sizeofG);for(inti=0;i<n;i++)scanf("%s",tt[i]);for(inti=0;i<n;i++){for(intj=0;j<m;j++){if(tt[i][j]==‘.‘)for(inte=0;e<4;e++){intni=i+dir[e][0];intnj=j+dir[e][1];if(ni>=0 && ni<n && nj>=0 && nj<m && tt[ni][nj]==‘.‘)G[i*m+j+1][ni*m+nj+1]=1;}}}intcnt=0;memset(link,0,sizeoflink);for(inti=0;i<=n*m;i++){memset(vis,false,sizeofvis);if(find(i))cnt++;}printf("%d\n",cnt/2);}return0;}
原文地址:http://blog.csdn.net/wxq_wuxingquan/article/details/26109085