2171 棋盘覆盖

给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖。


错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数组位置把数组大小调整为 \(maxn * maxn\)


Solution

经典的二分图匹配问题

\(1\) 要素: 每个点只能被一张骨牌覆盖

\(0\) 要素: 将棋盘黑白染色, 其对角线格子不可能被一张骨牌覆盖

染色方法: \(if(i + j) \% 2 == 0\) 染为白色

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define LL long long
  7. #define REP(i, x, y) for(int i = (x);i <= (y);i++)
  8. using namespace std;
  9. int RD(){
  10. int out = 0,flag = 1;char c = getchar();
  11. while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
  12. while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
  13. return flag * out;
  14. }
  15. const int maxn = 419, maxv = 1000019, INF = 1e9 + 19;
  16. int head[maxn * maxn],nume = 1;
  17. struct Node{
  18. int v,dis,nxt;
  19. }E[maxv << 3];
  20. void add(int u,int v,int dis){
  21. E[++nume].nxt = head[u];
  22. E[nume].v = v;
  23. E[nume].dis = dis;
  24. head[u] = nume;
  25. }
  26. int len, num;
  27. int map[maxn][maxn];
  28. int mx[4] = {1,-1, 0, 0};
  29. int my[4] = {0, 0, 1,-1};
  30. bool judge(int x, int y){
  31. if(x < 1 || x > len || y < 1 || y > len)return 0;
  32. return 1;
  33. }
  34. int id(int x, int y){return (x - 1) * len + y;}
  35. int mat[maxn * maxn], used[maxn * maxn];
  36. bool match(int u){
  37. for(int i = head[u];i;i = E[i].nxt){
  38. int v = E[i].v;
  39. if(!used[v]){
  40. used[v] = 1;
  41. if(!mat[v] || match(mat[v])){
  42. mat[v] = u;
  43. return 1;
  44. }
  45. }
  46. }
  47. return 0;
  48. }
  49. int main(){
  50. len = RD(), num = RD();
  51. REP(i, 1, num){
  52. int x = RD(), y = RD();
  53. map[x][y] = 1;
  54. }
  55. REP(i, 1, len)REP(j ,1, len){
  56. if((i + j) % 2 == 1 || map[i][j])continue;
  57. int u = id(i ,j);
  58. for(int k = 0;k < 4;k++){
  59. int nx = i + mx[k];
  60. int ny = j + my[k];
  61. if(!judge(nx, ny))continue;
  62. if(map[nx][ny])continue;
  63. int v = id(nx, ny);
  64. add(u, v, 1);
  65. }
  66. }
  67. int ans = 0;
  68. REP(i, 1, len)REP(j, 1, len){
  69. if((i + j) % 2 == 1 || map[i][j])continue;
  70. memset(used, 0, sizeof(used));
  71. if(match(id(i, j)))ans++;
  72. }
  73. printf("%d\n", ans);
  74. return 0;
  75. }

CODEVS 2171 棋盘覆盖的更多相关文章

  1. TYVJ 1035 / codevs 2171 棋盘覆盖

    Problem Description 给定一个n * m的棋盘,已知某些各自禁止放置,求最多往棋盘上放多少长度为2宽度为1的骨牌(骨牌不重叠) Input 第一行为n,m(表示有m个删除的格子)第二 ...

  2. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  3. NYOJ 45 棋盘覆盖

    棋盘覆盖 水题,题不难,找公式难 import java.math.BigInteger; import java.util.Scanner; public class Main { public s ...

  4. 棋盘覆盖(大数阶乘,大数相除 + java)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  5. NYOJ 45 棋盘覆盖 模拟+高精度

    题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...

  6. 棋盘覆盖(一) ACM

    棋盘覆盖 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求 ...

  7. 棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

  8. 递归与分治策略之棋盘覆盖Java实现

    递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...

  9. JavaScript编写棋盘覆盖

    一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关 ...

随机推荐

  1. 面向对象OO第15次作业总结

    面向对象OO第15次作业总结 1.论述测试与正确性论证的效果差异,比较其优缺点测试通过大量测试数据来覆盖测试代码,比较直观,优点在于知道测的是啥,特别直观,缺点在于很难覆盖所有情况.正确性论证从逻辑关 ...

  2. EDK_II环境搭建与测试

    一. 环境准备 Windows 10 (64位)专业版 Visual Studio 2010旗舰版(默认路径安装) Mscrosoft SDKs 7.0A BIOS综合包里的EDK开发环境 二. 实验 ...

  3. Git管理分支

    管理分支:git branch 直至现在为止,我们的项目版本库一直都是只有一个分支 master.在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支.下面列举一些常见的分支策略, ...

  4. mvc 页面方法学习-RenderBody方法

    教程地址:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/introduction/adding-a-view

  5. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  6. AWS上的实例无法ping通的解决方案

    首先Ping只是向服务器发送ICMP的数据包,如果在服务器的防火墙没有允许ICMP协议的数据包的话,那么即使服务器正常运行,那也是ping不同的. 对于亚马逊云服务器,首先我们要确保实例绑定的安全组允 ...

  7. 配置高可用集群(实验) corosyne+pacemaker

    环境准备: 一准备三个虚拟机,把/etc/hosts/文件配置好                              192.168.43.9 node0                     ...

  8. Scrum 5.0

    5.0--------------------------------------------------- 1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理 ...

  9. 10.13课堂Scrum站立会议

    项目名称:C#实现的连连看游戏 小组名称:计信F4 开会时间 :2016年10月11日 20:20~20:40 组长:张政 成员:张金生,武志远,李泉 内容: 昨日已完成: 张政:构建基础逻辑,实现游 ...

  10. 11git更改提交

    .将不必要的文件add .上次提交觉得是错的 .不想改变暂存区内容,只是想调整提交的信息 .版本回滚 git reset HEAD 文件名 移除不必要的添加到暂存区的文件 git reset HEAD ...