放积木

Description

现有一个n*m的矩阵方格和1*2、2*1两种积木。矩阵中有些格子是不能放积木的,摆放的积木是不能互相重合的,当然,积木也不能放到矩阵外面。问,这个矩阵,最多能放多少积木?

Input

多组输入,每组第一行有两个整数n、m,表示矩阵有n行,m列。(1<=n,m<=10)
接下来,会有n行字符串,每行有m个字符。字符只会是‘.’ 或‘*’, ‘*’表示这个格子不能放积木,‘.’表示这个格子可以放积木。

Output

每组输出一行,这行包含一个数字,表示这个矩阵最多放的积木数量。

Sample Input

5 2
.*
..
.*
..
*.

Sample Output

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) << endl

using namespace std;

const int mmax=200;

const int inf=0x3fffffff;

bool G[mmax][mmax];

char tt[mmax][mmax];

int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

bool vis[mmax];

int link[mmax];

int n,m;

bool find(int x)

{

    for(int i=1;i<=n*m;i++)

    {

        if(G[x][i] && !vis[i])

        {

            vis[i]=true;

            if(link[i]==0  ||  find(link[i]))

            {

                link[i]=x;

                return true;

            }

        }

    }

    return false;

}

  

int main()

{

    while(scanf("%d %d",&n,&m)!=EOF)

    {

        memset(G,false,sizeof G);

        for(int i=0;i<n;i++)

            scanf("%s",tt[i]);

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<m;j++)

            {

                if(tt[i][j]=='.')

                    for(int e=0;e<4;e++)

                    {

                        int ni=i+dir[e][0];

                        int nj=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;

                     }

            }

        }

        int cnt=0;

        memset(link,0,sizeof link);

        for(int i=0;i<=n*m;i++)

        {

            memset(vis,false,sizeof vis);

            if(find(i))

                cnt++;

        }

        printf("%d\n",cnt/2);

    }

    return 0;

}

更多做题心得的详情请查看(记得关注哦)https://mp.weixin.qq.com/s?__biz=MzIyOTM4MDMxNw==&mid=2247483798&idx=1&sn=d4fbd34e50ce4efda39d7710d2dc5dc9&chksm=e842d824df3551320d7f1ed85286b2616aec419f7a852cc5c9c9f270beb237b5e6ca83166162&token=1630951018&lang=zh_CN#rd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值