Oil Skimming

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 32768/32768 K (Java/Others)

Problem Description

Thanks to a certain “green” resources company, there is a new profitable industry of oil skimming. There are large slicks of crude oil floating in the Gulf of Mexico just waiting to be scooped up by enterprising oil barons. One such oil baron has a special plane that can skim the surface of the water collecting oil on the water’s surface. However, each scoop covers a 10m by 20m rectangle (going either east/west or north/south). It also requires that the rectangle be completely covered in oil, otherwise the product is contaminated by pure ocean water and thus unprofitable! Given a map of an oil slick, the oil baron would like you to compute the maximum number of scoops that may be extracted. The map is an NxN grid where each cell represents a 10m square of water, and each cell is marked as either being covered in oil or pure water.

Input

The input starts with an integer K (1 <= K <= 100) indicating the number of cases. Each case starts with an integer N (1 <= N <= 600) indicating the size of the square grid. Each of the following N lines contains N characters that represent the cells of a row in the grid. A character of ‘#’ represents an oily cell, and a character of ‘.’ represents a pure water cell.

Output

For each case, one line should be produced, formatted exactly as follows: “Case X: M” where X is the case number (starting from 1) and M is the maximum number of scoops of oil that may be extracted.

Sample Input

1 6

……

.##…

.##…

….#.

….##

……

Sample Output

Case 1: 3


解题心得:

  1. 题意很简单,就是要你在图中去截取1x2的方块,问最多能截取多少个。
  2. 就是一个二分匹配问题,还是很简单的,有两种建图的方法
    • 第一种是给每一个坐标编号,查找每一个‘#’的四周图形,然后建一个双向的图,得到的答案除2就可以了。
    • 第二种就更高级了,仔细观察可以观看一个点的行列之和与他四周的四个格子的行列和奇偶性一定是不同的,这样就可以参考国际象棋的棋盘,黑色的方格匹配白色方格,二分匹配。

弱智建图写代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 610;
char maps[maxn][maxn];
bool vis[maxn*maxn];
vector <int> ve[maxn*maxn];
int n,dir[4][2] = {0,1,0,-1,-1,0,1,0},match[maxn*maxn]; void init()
{
scanf("%d",&n);
for(int i=0;i<maxn;i++)
ve[i].clear();
memset(vis,0,sizeof(vis));
memset(maps,0,sizeof(maps));
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
scanf("%s",maps[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(maps[i][j] == '#')
for(int k=0;k<4;k++)
{
int x = i + dir[k][0];
int y = j + dir[k][1];
if(maps[x][y] == '#')
ve[i*n+j].push_back(x*n+y);//如果四周是‘#’就建立联系
} } bool dfs(int x)//match
{
for(int i=0;i<ve[x].size();i++)
{
int v = ve[x][i];
if(!vis[v])
{
vis[v] = true;
if(match[v] == -1 || dfs(match[v]))
{
match[v] = x;
return true;
}
}
}
return false;
} int solve()
{
int ans = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(maps[i][j] == '#')
{
memset(vis,0,sizeof(vis));
if(dfs(i*n+j))
ans++;
}
return ans;
} int main()
{
int t;
scanf("%d",&t);
int cas = 1;
while(t--)
{
init();
int ans = solve();
printf("Case %d: %d\n",cas++,ans/2);//因为建立的是双向图,所以一定要除2
}
return 0;
}

HDU:4185-Oil Skimming的更多相关文章

  1. HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】

    Oil Skimming Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  2. hdu 4185 Oil Skimming(二分图匹配 经典建图+匈牙利模板)

    Problem Description Thanks to a certain "green" resources company, there is a new profitab ...

  3. HDU 4185 Oil Skimming

    题目大意:在一个N*N的矩阵里寻找最多有多少个“##”(横着竖着都行).     题目分析:重新构图,直接以相邻的两个油井算中间算以条边,然后进行匹配,看看两两之间最多能匹配多少对. #include ...

  4. HDU 4185 Oil Skimming 【最大匹配】

    <题目链接> 题目大意: 给你一张图,图中有 '*' , '.' 两点,现在每次覆盖相邻的两个 '#' ,问最多能够覆盖几次. 解题分析: 无向图二分匹配的模板题,每个'#'点与周围四个方 ...

  5. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...

  6. 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

    如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...

  7. Oil Skimming HDU - 4185(匹配板题)

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. HDU4185:Oil Skimming(二分图最大匹配)

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. Hdu4185 Oil Skimming

    Oil Skimming Problem Description Thanks to a certain "green" resources company, there is a ...

随机推荐

  1. 转 dos 下的 find 和 重定向 and 删除

    1.find /i "ora-" *.* > check.log del /Q .\log\*.* 附录: 我对findstr是如此的依赖,以至于当我向各位讲解find命令的 ...

  2. notepad++添加到运行

    1. 点击开始,输入regedit,点击回车2.在注册表中找到 HKEY_CLASSES_ROOT 下面的 Applications3.修改注册表 1).在Applications下面找到对应的程序名 ...

  3. 《深入理解java虚拟机》笔记(6)内存分配与回收策略

    一.垃圾回收日志说明 [GC[DefNew: 7307K->494K(9216K), 0.0043710 secs] 7307K->6638K(19456K), 0.0044894 sec ...

  4. spring和springmvc是单例还是多例

    这么说其实不规范 spring的bean    默认是单例 springmvc的controller    默认是单例 所以最好不要在controller里定义成员变量 都可通过注解 @scope=p ...

  5. HBuilder配置sass

    参考: https://www.cnblogs.com/padding1015/p/7133811.html 如果期间报错,参考步骤7,然后再重新安装配置 预编译配置--no-cache %FileN ...

  6. sql 容易被忽视的点

    1 dual select查询语句只有select就可以,但为了规范,凑结构,可以加个dual 例:select now() from dual; 这个概念是Oracle中的.在mysql中可写可不写 ...

  7. mongodb的投影

    mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段. find() 方法 MongoDB 的find()方法, ...

  8. 开发中遇到的Cause: java.sql.SQLException: connection holder is null的异常

    异常的出现是属于获取连接超时,从而找不到持有者. 项目中的配置体现: <property name="removeAbandoned" value="true&qu ...

  9. centos下无法直接删除乱码文件及文件夹解决方案

    不知道怎么回事今天在系统上发现有一个名字为“\”的文件,使用rm -f \ 无法删除,最后没办法只能使用文件的inode号进行删除,以下是相关步骤: [oracle@prod-db ~]$ ls -i ...

  10. Web端 session cookies Application viewstate

    URL传值/QueryString1.不占用服务器内存2.保密性差,传递值的长度有限 因为  上篇文章 保密性差,长度有限   传值有限只能传string类型的值 这篇文章学的知识是 session ...