链接:

https://vjudge.net/problem/HDU-1045#author=zzuli_contest

题意:

假设我们有一个有直街的广场城市。城市地图是一个方形板,有n行和n列,每列代表一条街道或一块墙。

碉堡是一座小城堡,有四个开口可以射击。四个开口分别面向北,东,南和西。每个开口都会有一挺机枪射击。

在这里,我们假设子弹是如此强大,以至于它可以穿越任何距离并在途中摧毁一个碉堡。另一方面,墙壁结构坚固,可以阻止子弹。

目标是尽可能多地在城市中设置碉堡,这样就不会有两个碉堡相互摧毁。如果没有两个碉堡在地图的同一水平行或垂直列上,除非至少有一个墙将它们分开,否则碉堡的配置是合法的。在这个问题中,我们将考虑小方形城市(最多4x4),其中包含无法穿过子弹的墙壁。

下图显示了同一块板的五张图片。第一张图片是空白板,第二张和第三张图片显示合法配置,第四张和第五张图片显示非法配置。对于该板,合法配置中的最大块仓数为5; 第二张图片显示了一种方法,但还有其他几种方法。

您的任务是编写一个程序,在给定地图描述的情况下,计算可以在合法配置中放置在城市中的最大数量的阻止房屋。

思路:

将一行,通过墙壁被分成几块,行和列相同处理,在进行二分图的最大匹配

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <memory.h>
#include <queue>
#include <set>
#include <map>
using namespace std; const int MAXN = 10;
char Map[MAXN][MAXN];
int DisRow[MAXN][MAXN];
int DisCol[MAXN][MAXN];
int Linked[20], Vis[20];
vector<int> G[MAXN];
int n;
int row, col; bool Dfs(int x)
{
for (int i = 0;i < G[x].size();i++)
{
int nextnode = G[x][i];
if (Vis[nextnode])
continue;
Vis[nextnode] = 1;
if (Linked[nextnode] == -1 || Dfs(Linked[nextnode]))
{
Linked[nextnode] = x;
return true;
}
}
return false;
} int Solve()
{
int cnt = 0;
memset(Linked, -1, sizeof(Linked));
for (int i = 1;i <= row;i++)
{
memset(Vis, 0, sizeof(Vis));
if (Dfs(i))
cnt++;
}
return cnt;
} int main()
{
while (~scanf("%d", &n) && n)
{
for (int i = 1;i <= n;i++)
scanf("%s", Map[i]+1);
row = col = 0;
for (int i = 1;i <= n;i++)
{
bool flag = false;
for (int j = 1;j <= n;j++)
{
if (Map[i][j] == '.')
{
if (!flag)
DisRow[i][j] = ++row, flag = true;
else
DisRow[i][j] = row;
}
else
flag = false;
}
}
for (int i = 1;i <= n;i++)
{
bool flag = false;
for (int j = 1;j <= n;j++)
{
if (Map[j][i] == '.')
{
if (!flag)
DisCol[j][i] = ++col, flag = true;
else
DisCol[j][i] = col;
}
else
flag = false;
}
}
for (int i = 1;i <= n*n;i++)
G[i].clear();
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n;j++)
if (Map[i][j] == '.')
G[DisRow[i][j]].push_back(DisCol[i][j]);
}
int cnt = Solve();
cout << cnt << endl;
} return 0;
}

最新文章

  1. 使用do{ } while(0)的好处
  2. jQuery进阶
  3. 通过实战理解C语言精要——函数篇
  4. php多进程
  5. C# unmanaged function pointers for iOS
  6. svn教程
  7. untiy 插件工具: 游戏中 策划数据Excel 导出到项目中
  8. [POJ 3420] Quad Tiling
  9. 【Javascript&amp;Jquery基础归纳】- 加载相关
  10. iOS-SQLite(FMDB)
  11. 管理 MariaDB 用户账户
  12. Aforge.net识别简易数字验证码问题
  13. Angular CLI: 全局脚本
  14. python第一章:简介与安装--小白博客
  15. Puppeteer - 谷歌推出的自动化测试工具库
  16. iOS - 极光推送证书的创建及过期处理
  17. java 堆排序的实现
  18. Django中cookie和session
  19. ios 个人开发者账户 给其他团队用坑爹的教程
  20. 配置PyCharm(背景色+字体大小+解释器选择)

热门文章

  1. freetype HarfBuzz fontconfig Cairo 编译顺序
  2. div 加滚动条 超过div宽度 自动换行 div居中
  3. centos v7.0解决乱码
  4. USACO4.3 Buy Low, Buy Lower【简单dp&#183;高精度】
  5. JS实现网页选取截屏 保存+打印 功能(转)
  6. mybatis+mysql 返回主键
  7. MFC,QT与WinForm,WPF简介
  8. c++ Convert struct to bytes
  9. 09: mysql基础面试题
  10. Maven build 命令介绍(转)