题目网址:https://www.luogu.com.cn/problem/P1074

大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分。思路大致从零最少的行开始搜索(试想现实中你做数独一定是这样的方法),然后只要将0位置的信息保存,总数就是深度值。按照优先搜索的顺序逐个填写,为了节省计算资源,在搜索之前就预处理0位置的相关信息。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef unsigned int ui;
  4. typedef long long ll;
  5. typedef unsigned long long ull;
  6. #define mem(a) memset(a,0,sizeof(a))
  7. #define prime1 1e9+7
  8. #define prime2 1e9+9
  9. #define scand(x) scanf("%llf",&x)
  10. #define dbg(args) cout<<#args<<":"<<args<<endl;
  11. #define pb(i) push_back(i)
  12. #define ppb(x) pop_back(x)
  13. #define scan(a) scanf("%d",&a)
  14. #define pf printf
  15. #define f(i,a,b) for(int i=a;i<=b;i++)
  16. int n,init,tot,ans=-,a[][],hang[][],lie[][],gong[][],s[][];
  17. //s[][0]保存行,s[][1]保存列,s[][2]保存宫,s[][3] 保存得分
  18. struct node{
  19. int hang,zero_cnt;
  20. }p[];
  21. bool cmp(node& a, node& b)
  22. {
  23. return a.zero_cnt<b.zero_cnt;
  24. }
  25.  
  26. int score(int x,int y)
  27. {
  28. if(x==&&y==)return ;
  29. else if(x>=&&x<=&&y>=&&y<=)return ;
  30. else if(x>=&&x<=&&y>=&&y<=)return ;
  31. else if(x>=&&x<=&&y>=&&y<=)return ;
  32. else return ;
  33. }
  34. int which(int x,int y)
  35. {
  36. if(x>=&&x<=&&y>=&&y<=)return ;
  37. else if(x>=&&x<=&&y>=&&y<=)return ;
  38. else if(x>=&&x<=&&y>=&&y<=)return ;
  39. else if(x>=&&x<=&&y>=&&y<=)return ;
  40. else if(x>=&&x<=&&y>=&&y<=)return ;
  41. else if(x>=&&x<=&&y>=&&y<=)return ;
  42. else if(x>=&&x<=&&y>=&&y<=)return ;
  43. else if(x>=&&x<=&&y>=&&y<=)return ;
  44. else if(x>=&&x<=&&y>=&&y<=)return ;
  45. }
  46. void dfs(int dep ,int sum)//搜索深度以及得分总数
  47. {
  48. if(dep==tot)
  49. {
  50. // dbg(sum);
  51. if(sum>ans)ans=sum;
  52. return ;
  53. }
  54. f(i,,)//在dep深度的位置填1-9的数字
  55. {
  56. //行列宫都不冲突
  57. if(!hang[s[dep][]][i]&&!lie[s[dep][]][i]&&!gong[s[dep][]][i])
  58. {
  59. hang[s[dep][]][i]=lie[s[dep][]][i]=gong[s[dep][]][i]=;
  60. dfs(dep+,sum+i*s[dep][]);
  61. hang[s[dep][]][i]=lie[s[dep][]][i]=gong[s[dep][]][i]=;
  62. }
  63. }
  64. return;
  65. }
  66. int main()
  67. {
  68. //freopen("input.txt","r",stdin);
  69. //freopen("output.txt","w",stdout);
  70. std::ios::sync_with_stdio(false);
  71. f(i,,)
  72. {
  73. p[i].hang=i;
  74. f(j,,)
  75. {
  76. scan(a[i][j]);
  77. if(a[i][j])
  78. {
  79. init+=a[i][j]*score(i,j);
  80. hang[i][a[i][j]]=;
  81. lie[j][a[i][j]]=;
  82. gong[which(i,j)][a[i][j]]=;
  83. }
  84. else
  85. {
  86. p[i].zero_cnt++;
  87. }
  88. }
  89. }
  90.  
  91. sort(p+,p+,cmp);
  92.  
  93. f(i,,)
  94. {
  95. f(j,,)
  96. {
  97. if(a[p[i].hang][j]==)
  98. {
  99. s[tot][]=p[i].hang;//保存每个零位置的行、列、宫以及得分,否则dfs中将会重复计算
  100. s[tot][]=j;
  101. s[tot][]=which(p[i].hang,j);
  102. s[tot++][]=score(p[i].hang,j);
  103. }
  104. }
  105. }
  106. // dbg(init);
  107. //dbg(tot);
  108. dfs(,init);//从第0个零的位置开始搜索,初始得分为init
  109. pf("%d",ans);
  110. return ;
  111. }

洛谷1074 靶状数独dfs 排序、记录、搜索的更多相关文章

  1. 洛谷1378 油滴扩展 dfs进行回溯搜索

    题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...

  2. 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独

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

  3. [洛谷P3809]【模板】后缀排序

    [洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...

  4. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

  5. 【题解】洛谷P1074 [NOIP2009TG] 靶形数独(DFS+剪枝)

    洛谷P1074:https://www.luogu.org/problemnew/show/P1074 思路 这道题一看就是DFS 打一个分数表方便后面算分 我用x y z数组分别表示行 列 宫 是否 ...

  6. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  7. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  8. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  9. 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】

    [已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...

随机推荐

  1. MyEclipse提示Errors occurred during the build

    最近在使用Extjs 在springsource Tool Suite运行时老是出现: Errors occurred during the build. Errors running builder ...

  2. Python不使用元类创建缓存实例

    问题 当创建类实例时我们想返回一个缓存引用,让其指向上一个用同样参数(如果有的话)创建出来的类实例. 这个问题常常出现在当我们想确保针对一组输入参数只会有一个类实例存在时. 解决方法: 使用一个与类本 ...

  3. docker mysql5.7.16 中文乱码

    有部分同学会遇到,在centos上Docker-MySQL没乱码,但是在fedora系统上的docker-mysql会有乱码问题,这兴许是docker-mysql的问题,这里的bug我们不去追究,这里 ...

  4. Linux Command Backup

    User Structure linux command review 列出所有信号 找到名字后,kill 或者用ps找到 kill同名进程 每隔一秒高亮显示网络链接数的变化情况 启动关闭制定网卡 关 ...

  5. 201771010105—达拉草 实验一 软件工程准备—<软件工程构建之法—初步了解和认识>

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. 初识 jquery.simulate.js 模拟键盘事件

    用jquery 和 jquery.simulate.js 实现模拟键盘事件,点击上下左右div相当于点击键盘的上下左右键 <!DOCTYPE html> <html> < ...

  7. 前端每日实战:145# 视频演示如何用纯 CSS 创作一个电源开关控件

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PdMyJd 可交互视频 此视频是可 ...

  8. HTTP入门(一):在Bash中curl查看请求与响应

    HTTP入门(一):在Bash中curl查看请求与响应 本文简单总结HTTP的请求与响应. 本文主要目的是对学习内容进行总结以及方便日后查阅. 详细教程和原理可以参考HTTP文档(MDN). 本文版权 ...

  9. Xml反序列化记录

    1.概述 公司项目遇到一个需要对接webservice的,webservice大部分用的都是xml来传输的,这里记录一下xml反序列化遇到的问题 2.xml工具类 xml序列化: public sta ...

  10. Windows10 JDK1.8安装及环境变量配置

    一.下载JDK1.8: 下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html  二.安装步骤: 我们通常选择 ...