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,描述一个守卫的位置。

输入输出样例

输入样例#1:

  1. 3 4
  2. 2 0 0 0
  3. 2 2 2 1
  4. 0 1 0 2
输出样例#1:

  1. 2
  2. 1 2
  3. 3 3

说明

样例数据如图5-2(黑色方格为墙,白色方格为空地,圆圈为陷阱,G表示守卫)

由@zhouyonglong提供SPJ

【题解】

空间开到2000疯狂TLE,开到3000T的更多,然后改成200

A了

我******

二分图最大匹配。把行列的01连通块标号,每个0都是连接行列的边

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <algorithm>
  6.  
  7. inline void read(int &x)
  8. {
  9. x = ;char ch = getchar(), c = ch;
  10. while(ch < '' || ch > '')c = ch, ch = getchar();
  11. while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
  12. if(c == '-')x = -x;
  13. }
  14.  
  15. const int MAXN = + ;
  16.  
  17. int gg[MAXN][MAXN];
  18. int lk[MAXN * MAXN], b[MAXN * MAXN], g[MAXN][MAXN], r, c, n, m, tmp, line[MAXN][MAXN], row[MAXN][MAXN];
  19.  
  20. struct Edge
  21. {
  22. int u,v,next;
  23. Edge(int _u, int _v, int _next){u = _u;v = _v;next = _next;}
  24. Edge(){}
  25. }edge[MAXN * MAXN];
  26. int head[MAXN * MAXN],cnt;
  27. void insert(int a, int b)
  28. {
  29. edge[++cnt] = Edge(a,b,head[a]);
  30. head[a] = cnt;
  31. }
  32.  
  33. int dfs(int u)
  34. {
  35. for(register int pos = head[u];pos;pos = edge[pos].next)
  36. {
  37. int v = edge[pos].v;
  38. if(!b[v])
  39. {
  40. b[v] = ;
  41. if(lk[v] == - || dfs(lk[v]))
  42. {
  43. lk[v] = u;
  44. return ;
  45. }
  46. }
  47. }
  48. return ;
  49. }
  50.  
  51. int xiongyali()
  52. {
  53. int ans = ;
  54. memset(lk, -, sizeof(lk));
  55. for(register int i = ;i <= n;++ i)
  56. {
  57. memset(b, , sizeof(b));
  58. ans += dfs(i);
  59. }
  60. return ans;
  61. }
  62.  
  63. int main()
  64. {
  65. read(r), read(c);
  66. register int i,j;
  67. for(i = ;i <= r;++ i)
  68. for(j = ;j <= c;++ j)
  69. read(gg[i][j]);
  70. register int tot = ;
  71. for(i = ;i <= r;++ i)
  72. for(j = ;j <= c;++ j)
  73. if(gg[i][j] != )
  74. {
  75. ++ tot;
  76. while(gg[i][j] != && j <= c)row[i][j] = tot,++ j;
  77. }
  78. n = tot;
  79. tot = ;
  80. for(j = ;j <= c;++ j)
  81. for(i = ;i <= r;++ i)
  82. if(gg[i][j] != )
  83. {
  84. ++ tot;
  85. while(gg[i][j] != && i <= r)line[i][j] = tot, ++ i;
  86. }
  87. m = tot;
  88. for(i = ;i <= r;++ i)
  89. for(j = ;j <= c;++ j)
  90. if(gg[i][j] == )
  91. insert(row[i][j], line[i][j]);
  92. printf("%d\n", xiongyali());
  93. for(register int k = ;k <= m;++ k)
  94. {
  95. int flag = ;
  96. if(lk[k] != -)
  97. {
  98. for(i = ;i <= r;++ i)
  99. {
  100. for(j = ;j <= c;++ j)
  101. {
  102. if(row[i][j] == lk[k] && line[i][j] == k && gg[i][j] == )
  103. {
  104. printf("%d %d\n", i, j);
  105. flag = ;
  106. break;
  107. }
  108. }
  109. if(flag)break;
  110. }
  111. }
  112. }
  113. return ;
  114. }

洛谷P1263

洛谷P1263 宫廷守卫的更多相关文章

  1. 洛谷 P1263 宫廷守卫

    被这道题折腾了 \(2\) 个小时. 按照题意,每个守卫的上下左右四个方向上应当都是墙,而不能出现其他的守卫. 如图是一个合法的放置方案.每个守卫四个方向上都是墙(包括宫廷外墙). 如图是一个非法的放 ...

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

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

  3. 洛谷P4563 [JXOI2018]守卫(dp)

    题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...

  4. [洛谷P4563][JXOI2018]守卫

    题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...

  5. 【题解】宫廷守卫 [P1263]

    [题解]宫廷守卫 [P1263] 传送门:宫廷守卫 \([P1263]\) [题目描述] 给出一个 \(n*m\) 的方格图,分别用整数 \(0,1,2\) 表示空地.陷阱.墙,空地上可以放置守卫,如 ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. 深入浅出Mybatis系列(一)---Mybatis入门[转]

    最近两年 springmvc + mybatis 的在这种搭配还是蛮火的,楼主我呢,也从来没真正去接触过mybatis, 趁近日得闲, 就去学习一下mybatis吧. 本次拟根据自己的学习进度,做一次 ...

  2. iOS开发使用UIScrollView随笔

    1.scrollview滚动到固定偏移量contenOffset - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)anim ...

  3. Java学习之一(引用相关)

    1.Java概述 首先,Java是一门面向对象的编程语言.相对于C/C++等语言,Java中没有指针,但是这不代表指针等知识不重要:Java中不存在多继承但是存在多接口.在我自己的学习过程之中,我偏向 ...

  4. Django之模板语言(二)-----Filter

    1.其他常用的模板语言: 通过模板语言可以让前端页面显示数据,数据可以是基本数据类型,也可以是对象亦或者对象的列表,结合着模板中的for.if等配合使用. 要注意前端页面中,出现没有后端数据的情况,随 ...

  5. adb环境部署及与模拟器的连接

    1.下载adt-bundle-windows-x64安装包,下载网址https://www.7down.com/soft/293453.html 2.对安装包进行解压缩 3.配置环境变量,将adb的路 ...

  6. elasticsearch 中文API river

    river-jdbc 安装 ./bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/pl ...

  7. Luogu P1401 城市(二分+网络流)

    P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...

  8. Innodb_buffer_pool_read

    > show status like 'Innodb_buffer_pool_read_%'; +---------------------------------------+-------- ...

  9. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  10. Vscode中问题

    1.VScode中如果安装vim插件,那么编辑代码时会默认使用vim 2.出现任何问题都在设置的首选项里面修改,比如终端无法复制,或者终端右击的默认操作等