洛谷P1263 宫廷守卫
P1263 宫廷守卫
题目描述
从前有一个王国,这个王国的城堡是一个矩形,被分为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表示守卫)
由@zhouyonglong提供SPJ
【题解】
空间开到2000疯狂TLE,开到3000T的更多,然后改成200
A了
我******
二分图最大匹配。把行列的01连通块标号,每个0都是连接行列的边
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- inline void read(int &x)
- {
- x = ;char ch = getchar(), c = ch;
- while(ch < '' || ch > '')c = ch, ch = getchar();
- while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
- if(c == '-')x = -x;
- }
- const int MAXN = + ;
- int gg[MAXN][MAXN];
- int lk[MAXN * MAXN], b[MAXN * MAXN], g[MAXN][MAXN], r, c, n, m, tmp, line[MAXN][MAXN], row[MAXN][MAXN];
- struct Edge
- {
- int u,v,next;
- Edge(int _u, int _v, int _next){u = _u;v = _v;next = _next;}
- Edge(){}
- }edge[MAXN * MAXN];
- int head[MAXN * MAXN],cnt;
- void insert(int a, int b)
- {
- edge[++cnt] = Edge(a,b,head[a]);
- head[a] = cnt;
- }
- int dfs(int u)
- {
- for(register int pos = head[u];pos;pos = edge[pos].next)
- {
- int v = edge[pos].v;
- if(!b[v])
- {
- b[v] = ;
- if(lk[v] == - || dfs(lk[v]))
- {
- lk[v] = u;
- return ;
- }
- }
- }
- return ;
- }
- int xiongyali()
- {
- int ans = ;
- memset(lk, -, sizeof(lk));
- for(register int i = ;i <= n;++ i)
- {
- memset(b, , sizeof(b));
- ans += dfs(i);
- }
- return ans;
- }
- int main()
- {
- read(r), read(c);
- register int i,j;
- for(i = ;i <= r;++ i)
- for(j = ;j <= c;++ j)
- read(gg[i][j]);
- register int tot = ;
- for(i = ;i <= r;++ i)
- for(j = ;j <= c;++ j)
- if(gg[i][j] != )
- {
- ++ tot;
- while(gg[i][j] != && j <= c)row[i][j] = tot,++ j;
- }
- n = tot;
- tot = ;
- for(j = ;j <= c;++ j)
- for(i = ;i <= r;++ i)
- if(gg[i][j] != )
- {
- ++ tot;
- while(gg[i][j] != && i <= r)line[i][j] = tot, ++ i;
- }
- m = tot;
- for(i = ;i <= r;++ i)
- for(j = ;j <= c;++ j)
- if(gg[i][j] == )
- insert(row[i][j], line[i][j]);
- printf("%d\n", xiongyali());
- for(register int k = ;k <= m;++ k)
- {
- int flag = ;
- if(lk[k] != -)
- {
- for(i = ;i <= r;++ i)
- {
- for(j = ;j <= c;++ j)
- {
- if(row[i][j] == lk[k] && line[i][j] == k && gg[i][j] == )
- {
- printf("%d %d\n", i, j);
- flag = ;
- break;
- }
- }
- if(flag)break;
- }
- }
- }
- return ;
- }
洛谷P1263
洛谷P1263 宫廷守卫的更多相关文章
- 洛谷 P1263 宫廷守卫
被这道题折腾了 \(2\) 个小时. 按照题意,每个守卫的上下左右四个方向上应当都是墙,而不能出现其他的守卫. 如图是一个合法的放置方案.每个守卫四个方向上都是墙(包括宫廷外墙). 如图是一个非法的放 ...
- 洛谷P1263 || 巴蜀2311 宫廷守卫
题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在城堡里布置守卫,他希望 ...
- 洛谷P4563 [JXOI2018]守卫(dp)
题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...
- [洛谷P4563][JXOI2018]守卫
题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...
- 【题解】宫廷守卫 [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 ...
随机推荐
- 深入浅出Mybatis系列(一)---Mybatis入门[转]
最近两年 springmvc + mybatis 的在这种搭配还是蛮火的,楼主我呢,也从来没真正去接触过mybatis, 趁近日得闲, 就去学习一下mybatis吧. 本次拟根据自己的学习进度,做一次 ...
- iOS开发使用UIScrollView随笔
1.scrollview滚动到固定偏移量contenOffset - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)anim ...
- Java学习之一(引用相关)
1.Java概述 首先,Java是一门面向对象的编程语言.相对于C/C++等语言,Java中没有指针,但是这不代表指针等知识不重要:Java中不存在多继承但是存在多接口.在我自己的学习过程之中,我偏向 ...
- Django之模板语言(二)-----Filter
1.其他常用的模板语言: 通过模板语言可以让前端页面显示数据,数据可以是基本数据类型,也可以是对象亦或者对象的列表,结合着模板中的for.if等配合使用. 要注意前端页面中,出现没有后端数据的情况,随 ...
- adb环境部署及与模拟器的连接
1.下载adt-bundle-windows-x64安装包,下载网址https://www.7down.com/soft/293453.html 2.对安装包进行解压缩 3.配置环境变量,将adb的路 ...
- elasticsearch 中文API river
river-jdbc 安装 ./bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/pl ...
- Luogu P1401 城市(二分+网络流)
P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...
- Innodb_buffer_pool_read
> show status like 'Innodb_buffer_pool_read_%'; +---------------------------------------+-------- ...
- JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...
- Vscode中问题
1.VScode中如果安装vim插件,那么编辑代码时会默认使用vim 2.出现任何问题都在设置的首选项里面修改,比如终端无法复制,或者终端右击的默认操作等