Description
  从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格。一些方格是墙,而另一些是空地。这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地。
  一天,国王决定在城堡里布置守卫,他希望安排尽量多的守卫。守卫们都是经过严格训练的,所以一旦他们发现同行或同列中有人的话,他们立即向那人射击。因此,国王希望能够合理地布置守卫,使他们互相之间不能看见,这样他们就不可能互相射击了。守卫们只能被布置在空地上,不能被布置在陷阱或墙上,且一块空地只能布置一个守卫。如果两个守卫在同一行或同一列,并且他们之间没有墙的话,他们就能互相看见。(守卫就像象棋里的车一样)
  你的任务是写一个程序,根据给定的城堡,计算最多可布置多少个守卫。 Input
  第一行两个整数M和N(1≤M,N≤200),表示城堡的规模。
  接下来M行N列的整数,描述的是城堡的地形。第i行j列的数用ai,j表示。   ai,j=0,表示方格[i,j]是一块空地;
  ai,j=1,表示方格[i,j]是一个陷阱;   ai,j=2,表示方格[i,j]是墙。 Output
  一个整数K,表示最多可布置K个守卫。

把每一段连续的行、列看成二分图的左右部中的点,在能放的地方对所在行和列连边,答案就是二分图最大匹配。

#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int bel[210][210],fir[100010],ne[1000010],to[1000010],f[100010],
map[210][210],tot,totx,numx[100010],numy[100010],n,m,cnt=1;
bool vis[100010];
void add(int u,int v)
{cnt++;ne[cnt]=fir[u];fir[u]=cnt;to[cnt]=v;
}
void init()
{int i,j;bool flag;scanf("%d%d",&m,&n);for (i=1;i<=m;i++)for (j=1;j<=n;j++)scanf("%d",&map[i][j]);for (i=1;i<=m;i++){flag=1;for (j=1;j<=n;j++)if (map[i][j]==2)flag=1;else{if (flag){totx++;numx[totx]=i;}bel[i][j]=totx;flag=0;}}tot=totx;for (j=1;j<=n;j++){flag=1;for (i=1;i<=m;i++)if (map[i][j]==2)flag=1;else{if (flag){tot++;numy[tot]=j;}if (map[i][j]!=1){add(tot,bel[i][j]);add(bel[i][j],tot);}flag=0;}}
}
bool dfs(int u)
{int i,v;for (i=fir[u];i;i=ne[i])if (!vis[v=to[i]]){vis[v]=1;if (!f[v]||dfs(f[v])){f[u]=v;f[v]=u;return 1;}}return 0;
}
int main()
{int i,j;int ans=0;init();for (i=1;i<=tot;i++)if (!f[i]){for (j=1;j<=tot;j++)vis[j]=0;if (dfs(i)) ans++;}printf("%d\n",ans);
}

巴蜀2311 宫廷守卫相关推荐

  1. 洛谷P1263 || 巴蜀2311 宫廷守卫

    题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在城堡里布置守卫,他希望 ...

  2. 巴蜀 2311【练习试题】宫廷守卫

    Description 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在城堡里布 ...

  3. 洛谷P1263 宫廷守卫

    P1263 宫廷守卫 题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在 ...

  4. Codevs3567 宫廷守卫

    Codevs3567 宫廷守卫 Position: http://codevs.cn/problem/3567/ List Codevs3567 宫廷守卫 List Description Input ...

  5. 洛谷OJ P1263 宫廷守卫

    题目描述:给出一个n乘m的网格图,一共有3种格子:空地,陷阱和墙.你只能在空地上放守卫,而且放下的守卫不能存在有两个守卫在同一行或同一列,而且没有墙隔着的情况.(1≤n,m≤200) 100%做法: ...

  6. 【Codevs3567】宫廷守卫

    Position: http://codevs.cn/problem/3567/ Description 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这 ...

  7. 【硬核解说】一口气讲明白Angular的5种路由守卫RouteGuard是嘛玩意儿

    Angular的常用路由守卫有5种,按照执行顺序: ① CanLoad:进入到当前路由的时候触发(若用户没有权限访问,相应的模块并不会被加载.这里是指对应组件的代码). ↓ ② CanAcitivat ...

  8. Vue全局路由侦听beforeEach路由守卫附代码使用示例

    使用路由守卫beforeEach,可以实现路由侦听: 全局侦听路由跳转的实现代码: app.vue onLaunch: function(e) {this.$router.beforeEach((to ...

  9. uniapp防止多次点击_多次赔、不分组、价格低,守卫者3号真的这么“逆天”?...

    重疾险的形式多种多样,一般由轻中重疾责任.身故责任.单次赔付.多次赔付.癌症多次赔付.特疾保障中的几项组合而成,在<2019年重疾险盘点>中,远虑君作了如下梳理: 今天测评的守卫者3号,介 ...

最新文章

  1. asp.net传递参数
  2. 001_jQuery简介
  3. 小米一键上锁工具_小米智能门锁和猫眼,可女声变男声与访客隔门沟通
  4. [PSA]-PSA Certified简介
  5. 汇编语言等号=伪指令
  6. 关于jQuery中的trigger和triggerHandler方法的使用
  7. html div转换图片
  8. C#线程通信与异步委托
  9. C++学习之路 | PTA乙级—— 1049 数列的片段和 (20 分)(精简)
  10. php excel 函数,php实现excel中rank函数功能的方法
  11. Python类的self
  12. 关于.NET异步调用的初步总结
  13. Linux puppet的安装配置部署
  14. 更改一个主键的列的类型的步骤
  15. python中类的定义方法_Python类的定义、方法和属性使用
  16. 如何将cad导成jpg图片格式?
  17. 如何用photoshop做24色环_PS色相环制作方法和教程
  18. mysql和mybaits自增长序列详解_MyBatis Oracle 自增序列的实现方法
  19. 微信小程序登陆(两种写法)
  20. IE6躲躲猫bug -IE6 Peekaboo Bug

热门文章

  1. Datax中txtfilereader插件使用
  2. 照片做成视频的软件手机上用照片做成视频
  3. Spring学习理解---后置处理器
  4. MTK面试应该知道的N个问题 .
  5. Python 出生日期与天干地支属相星座
  6. 英雄联盟国服服务器谁修复,LOL国服服务器排名_国服服务器官方排名_3DM网游
  7. 树莓派下载Ubuntu20.04.3版本 +通过设置找到wifi标志+开启vnc远程桌面+灰屏解决方法
  8. Python学习(七)
  9. 06组 Beta冲刺(1/3)
  10. axture动画原型制作_冰雪奇缘:小彩蛋探秘,雪宝原来是戏精,艾莎老爸原型超威武...