洛谷P1263 || 巴蜀2311 宫廷守卫
题目描述
从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格。一些方格是墙,而另一些是空地。这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地。
一天,国王决定在城堡里布置守卫,他希望安排尽量多的守卫。守卫们都是经过严格训练的,所以一旦他们发现同行或同列中有人的话,他们立即向那人射 击。因此,国王希望能够合理地布置守卫,使他们互相之间不能看见,这样他们就不可能互相射击了。守卫们只能被布置在空地上,不能被布置在陷阱或墙上,且一 块空地只能布置一个守卫。如果两个守卫在同一行或同一列,并且他们之间没有墙的话,他们就能互相看见。(守卫就像象棋里的车一样)
你的任务是写一个程序,根据给定的城堡,计算最多可布置多少个守卫,并设计出布置的方案。
输入输出格式
输入格式:
第一行两个整数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]是墙。
输出格式:
第一行一个整数K,表示最多可布置K个守卫。
此后K行,每行两个整数xi和yi,描述一个守卫的位置。
输入输出样例
3 4
2 0 0 0
2 2 2 1
0 1 0 2
2
1 2
3 3
说明
样例数据如图5-2(黑色方格为墙,白色方格为空地,圆圈为陷阱,G表示守卫)
刚开始的写法是BFS出每个联通块,单独处理。
↑明显不对
后来发现可以把被墙隔开的同一行当成两行处理,列同理。
然后二分图匹配坐标即可。
对二分图的理解还是不透彻啊……
(代码仅提供思路,不保证正确性)(没有SPJ程序)
(巴蜀OJ上只要求输出最多守卫数量,已AC)
/*By SilverN*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct edge{
int v,nxt;
}e[mxn*];
int hd[mxn*],mct=;
void add_edge(int u,int v){
e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
}
int mp[mxn][mxn];
int idx,idy;
int hs[mxn][mxn];
int aidx[mxn*10],aidy[mxn*10];
int link[mxn*10],vis[mxn*10];
//
int n,m,ans=;
bool DFS(int u){
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(!vis[v]){
vis[v]=;
if(link[v]==- || DFS(link[v])){
link[v]=u;
return ;
}
}
}
return ;
}
void solve(){
memset(link,-,sizeof link);
for(int i=;i<=idx;i++){
memset(vis,,sizeof vis);
if(DFS(i))ans++;
}
return;
}
void init(){
int i,j;
bool flag=;
for(i=;i<=m;i++){
flag=;
for(j=;j<=n;j++){
if(mp[i][j]==){flag=;continue;}
if(flag){
++idx;
aidx[idx]=i;
flag=;
}
hs[i][j]=idx;
}
}
idy=idx;
for(j=;j<=n;j++){
flag=;
for(i=;i<=m;i++){
if(mp[i][j]==){flag=;continue;}
if(flag){
++idy;
aidy[idy]=j;
flag=;
}
if(mp[i][j])continue;
add_edge(idy,hs[i][j]);
add_edge(hs[i][j],idy);
// printf("%d %d:%d\n",i,j,idy);
}
}
return;
}
int main(){
m=read();n=read();
int i,j;
for(i=;i<=m;i++)
for(j=;j<=n;j++)
mp[i][j]=read();
init();
solve();
/* for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
printf("%d ",hs[i][j]);
}
printf("\n");
}*/
printf("%d\n",ans);
for(i=idx+;i<=idy;i++){
if(link[i]!=-)printf("%d %d\n",aidx[link[i]],aidy[i]);
}
return ;
}
洛谷P1263 || 巴蜀2311 宫廷守卫的更多相关文章
- 洛谷P1263 宫廷守卫
P1263 宫廷守卫 题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在 ...
- 洛谷 P1263 宫廷守卫
被这道题折腾了 \(2\) 个小时. 按照题意,每个守卫的上下左右四个方向上应当都是墙,而不能出现其他的守卫. 如图是一个合法的放置方案.每个守卫四个方向上都是墙(包括宫廷外墙). 如图是一个非法的放 ...
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5324 https://www.luogu.org/problemnew/show/P4563 ht ...
- 【题解】宫廷守卫 [P1263]
[题解]宫廷守卫 [P1263] 传送门:宫廷守卫 \([P1263]\) [题目描述] 给出一个 \(n*m\) 的方格图,分别用整数 \(0,1,2\) 表示空地.陷阱.墙,空地上可以放置守卫,如 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
随机推荐
- getBoundingClientRect详解
getBoundingClientRect获取的left和top始终是该元素相对于页面原点坐标的位置,当它大于原点坐标则为正数,等于原点坐标为零,小于为负数.
- kvm虚拟机日常管理和配置操作命令梳理
KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理.1)查看KVM虚拟机配置文件及运行状态KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/autostart目录是配置kvm ...
- python中的Unittest常用方法
import unittest class SimpleUnitTest(unittest.TestCase): def test_Fail(self): self.failUnless(True) ...
- awk 和 sed 使用案例
1.模仿wc的行为,统计一个文本文件的文件的字符数.行数.单词数. awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" ...
- 【.NET进阶】函数调用--函数栈
原文:http://www.cnblogs.com/rain-lei/p/3622057.html 函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回 ...
- 【MySQL】Linux MySQL学习记录
1.查看日志存放路径 show variables like 'general_log_file'; 2.查看日志是否开启 show global variables like 'log_bin%'; ...
- raid知识
1,raid形象理解(饮水机模型) http://dingyichao.blog.51cto.com/442449/698762 2,raid利用率 3,raid详细理解 raid0 raid ...
- vim自动添加注释
我想了下,要做好一件事, 1,首先喜欢它最才有动机去了解它 2,道听途说about那东西的,会去了解并去玩转 3,兴趣需要培养 一 添加vim头部信息. 系统:C67 追加以下代码到 /etc/vim ...
- C#性能优化:延迟初始化Lazy<T>
1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...
- SpringMvc学习心得(五)控制器产生与构建
SpringMvc学习心得(五)控制器产生与构建 标签: springspring mvc框架 2016-03-22 15:29 140人阅读 评论(0) 收藏 举报 分类: Spring(4) ...