题意:给定一个矩阵,当中有一些地方有水,如今有一些长度随意,宽为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 ", all); } return 0; }