POJ2226

来源:互联网 发布:数据库脚本怎么写 编辑:程序博客网 时间:2024/06/03 08:34

题意:给定一个矩阵,其中有一些地方有水,现在有一些长度任意,宽为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;}


0 0