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; }
相关文章推荐
- jquery固定在顶部的导航菜单
- 算法笔记——整数划分2
- 联网查看图片的Demo
- 为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?
- google推出的SwipeRefreshLayout下拉刷新用法
- 《C++ 沉思录》阅读笔记——代理类
- 写在准备找工作的日子里
- 十天学会php之第一天
- 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别
- 多线程(1)
- Java中equals和==的区别
- javaSE学习笔记之几个关键字this、super、final、static
- 3.1 坐标系简介
- 图片放大缩小
- 排序算法总结---树形选择排序,堆排序
- 补贴行动背后,火炬租房如何实现“去中介化”?
- 7.2 android volley超时重试设置
- 练习题 (八)
- resin安装配置
- Android初学之------检查前置摄像头是否存在