码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2226

时间:2015-07-03 09:22:10      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:poj      

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

思路:

技术分享    技术分享

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

代码如下:

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

const int N = 600;
int n, m, p, q;
bool lin[N][N];
int used[N], arr[N], mark[N][N];
char map[N][N];

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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ2226

标签:poj      

原文地址:http://blog.csdn.net/doris1104/article/details/46731039

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!