【题目链接】

https://www.luogu.org/problemnew/show/P1074

【算法】

搜索 + 剪枝

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int INF = 2e9;
  4.  
  5. struct point
  6. {
  7. int x,y;
  8. } a[];
  9.  
  10. int i,j,ans,n,Mask,t;
  11. int val[][];
  12. int w[],num[];
  13. bool used[];
  14. int row[],col[],grid[];
  15. bool solved;
  16.  
  17. const int s[][] =
  18. {
  19. {,,,,,,,,},
  20. {,,,,,,,,},
  21. {,,,,,,,,},
  22. {,,,,,,,,},
  23. {,,,,,,,,},
  24. {,,,,,,,,},
  25. {,,,,,,,,},
  26. {,,,,,,,,},
  27. {,,,,,,,,}
  28. };
  29.  
  30. inline int lowbit(int x)
  31. {
  32. return x & (-x);
  33. }
  34. inline void chkmax()
  35. {
  36. int i,ret = ;
  37. for (i = ; i < ; i++)
  38. {
  39. for (j = ; j < ; j++)
  40. {
  41. ret += val[i][j] * s[i][j];
  42. }
  43. }
  44. ans = max(ans,ret);
  45. }
  46. inline void dfs(int dep)
  47. {
  48. int i,mn,pos,v,t;
  49. if (dep > n)
  50. {
  51. solved = true;
  52. chkmax();
  53. return;
  54. } else
  55. {
  56. v = ; mn = INF;
  57. for (i = ; i <= n; i++)
  58. {
  59. if (!used[i])
  60. {
  61. t = row[a[i].x] & col[a[i].y] & grid[a[i].x/*+a[i].y/];
  62. if (!t) continue;
  63. if (w[t] < mn)
  64. {
  65. mn = w[t];
  66. pos = i;
  67. v = t;
  68. }
  69. }
  70. }
  71. while (v)
  72. {
  73. used[pos] = true;
  74. val[a[pos].x][a[pos].y] = num[lowbit(v)] + ;
  75. row[a[pos].x] ^= lowbit(v);
  76. col[a[pos].y] ^= lowbit(v);
  77. grid[a[pos].x/*+a[pos].y/] ^= lowbit(v);
  78. dfs(dep+);
  79. used[pos] = false;
  80. row[a[pos].x] ^= lowbit(v);
  81. col[a[pos].y] ^= lowbit(v);
  82. grid[a[pos].x/*+a[pos].y/] ^= lowbit(v);
  83. val[a[pos].x][a[pos].y] = ;
  84. v -= lowbit(v);
  85. }
  86. }
  87. }
  88.  
  89. int main()
  90. {
  91.  
  92. Mask = ( << ) - ;
  93. for (i = ; i <= Mask; i++)
  94. {
  95. w[i] = ;
  96. t = i;
  97. while (t)
  98. {
  99. w[i]++;
  100. t -= lowbit(t);
  101. }
  102. }
  103. for (i = ; i < ; i++) num[ << i] = i;
  104. for (i = ; i < ; i++) row[i] = col[i] = grid[i] = Mask;
  105. for (i = ; i < ; i++)
  106. {
  107. for (j = ; j < ; j++)
  108. {
  109. scanf("%d",&val[i][j]);
  110. if (!val[i][j])
  111. {
  112. n++;
  113. a[n] = (point){i,j};
  114. } else
  115. {
  116. row[i] ^= ( << (val[i][j] - ));
  117. col[j] ^= ( << (val[i][j] - ));
  118. grid[i/*+j/] ^= ( << (val[i][j] - ));
  119. }
  120. }
  121. }
  122. solved = false;
  123. dfs();
  124. if (solved) printf("%d\n",ans);
  125. else printf("-1\n");
  126.  
  127. return ;
  128.  
  129. }

【NOIP 2009】 靶形数独的更多相关文章

  1. NOIP 2009 靶形数独(DLX)

    小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作 ...

  2. [NOIp 2009]靶形数独

    Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...

  3. [COGS 0407][NOIP 2009] 靶形数独

    407. [NOIP2009] 靶形数独 ★★   输入文件:sudoku.in   输出文件:sudoku.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华 ...

  4. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  5. 【NOIP 2009】靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  6. NOIp 2009:靶形数独

    题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教, Z ...

  7. NOIP2009靶形数独[DFS 优化]

    描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...

  8. 靶形数独(codevs 1174)

    1174 靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  9. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  10. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

随机推荐

  1. VMWare linux安装mysql 5.7.13

    1.基础环境说明 虚拟机:VMWare 操作系统:linux 数据库版本:mysql 5.7.13 社区版(别问为什么不装企业版,因为企业版要钱) 背景:虚拟机可以连上外网 下载目录: /tools/ ...

  2. Python3编写Windows服务程序

    最近做了公司签到的小工具,有同事要求做成Windows服务,开机自启.先说下怎么用Python写Windows服务程序. #encoding=utf-8 import win32serviceutil ...

  3. C++ Rand()各种实现

    参考链接:http://www.cplusplus.com/reference/cstdlib/rand/ 使用实例: v1 = rand() % 100; // v1 in the range 0 ...

  4. 【技术累积】【点】【java】【20】static关键字

    基础概念 是个修饰符: 修饰变量.常量.方法.代码块: 被修饰的为静态: 方便在没有创建对象的情况下来进行调用(方法/变量): static修饰的成员被所有的对象所共享: static优先于对象存在, ...

  5. Unity与Android通信的中间件

    2.1.1 Fragment和Activity都需要实现的接口——IBaseView/** * Description:Basic interface of all {@link Activity} ...

  6. JavaScript for循环元素取下标问题

    <ul> <li>fg</li> <li>gd</li> <li>gds</li> <li>ghe< ...

  7. 切割窗口url

    var keyWords=location.href.split("?")[1].split("&"); console.log(keyWords) f ...

  8. 图片base64格式转为file文件类型上传方法

    日常使用文件上传方式,都是通过input type='file'的文件选择框进行文件上传.但是会通过其他交互方式等到图片的base64格式进行上传.具体情况如下示意: 在项目开发中,需要进行照片采集, ...

  9. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn.net/suncongbo/article/details/79382991 题目链接: (p ...

  10. elasticsearch 分布式阅读笔记(二)

    说明 扩展分为 纵向扩展:购买更好的服务器 横向扩展:增加服务器(elasticsearch更适合横向扩展) elasticsearch可以用于构建高可用和可扩展的系统,elasticsearch天生 ...