您的位置:首页 > 其它

POJ2226

2015-07-02 20:52 274 查看
题意:给定一个矩阵,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在所有板不跨越任何坑的前提下,用一些木板盖住这些有水的地方,问至少需要几块板子?

思路:





然后你们懂的,二分匹配好了。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 600;
int n, m, p, q;
bool lin

;
int used
, arr
, mark

;
char map

;

bool find(int x)
{
for(int j = 1; j <= q; j++)
{
if(lin[x][j] && used[j] == 0)
{
used[j] = 1;
if(arr[j] == 0 || find(arr[j]))
{
arr[j] = x;
return true;
}
}
}
return false;
}

int main()
{
int r, c;
while(~scanf("%d%d", &n, &m))
{
memset(map, '0', sizeof(map));
for(int i = 0; i < n; i++)
{
scanf("%s", &map[i]);
}
memset(lin, false , sizeof(lin));
memset(arr, 0, sizeof(arr));
p = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(map[i][j] == '*')
{
if(map[i][j-1] != '*')
{
p++;
}
mark[i][j] = p;
}
}
}
q = 0;
for(int j = 0; j < m; j++)
{
for(int i = 0; i < n; i++)
{
if(map[i][j] == '*')
{
if(map[i-1][j] != '*')
{
q++;
}
lin[mark[i][j]][q] = true;
}
}
}
int all = 0;
for(int i = 1; i <= p; i++)
{
memset(used, 0, sizeof(used));
if(find(i))
++all;
}
printf("%d\n", all);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: