「NOIP2009」靶形数独
传送门
Luogu
解题思路
这题其实挺简单的。
首先要熟悉数独,我们应该要优先搜索限制条件多的行,也就是可能方案少的行,显然这样可以剪枝,然后再发挥一下dfs的基本功就可以了。
细节注意事项
- 爆搜题,你们都懂。。。
参考代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
}
const int s[10][10] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
{ 0, 6, 7, 7, 7, 7, 7, 7, 7, 6 },
{ 0, 6, 7, 8, 8, 8, 8, 8, 7, 6 },
{ 0, 6, 7, 8, 9, 9, 9, 8, 7, 6 },
{ 0, 6, 7, 8, 9,10, 9, 8, 7, 6 },
{ 0, 6, 7, 8, 9, 9, 9, 8, 7, 6 },
{ 0, 6, 7, 8, 8, 8, 8, 8, 7, 6 },
{ 0, 6, 7, 7, 7, 7, 7, 7, 7, 6 },
{ 0, 6, 6, 6, 6, 6, 6, 6, 6, 6 }
};
const int p[10][10] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 },
{ 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 },
{ 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 },
{ 0, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
{ 0, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
{ 0, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
{ 0, 7, 7, 7, 8, 8, 8, 9, 9, 9 },
{ 0, 7, 7, 7, 8, 8, 8, 9, 9, 9 },
{ 0, 7, 7, 7, 8, 8, 8, 9, 9, 9 },
};
struct node { int id, cnt; }a[10];
inline bool cmp(const node& x, const node& y) { return x.cnt > y.cnt; }
int ans = -1, mp[10][10]; bool Line[10][10], Clmn[10][10], Palc[10][10];
inline void dfs(int i, int j, int line, int sum) {
if (line > 9) { ans = max(ans, sum); return; }
if (j == 10) { dfs(a[line + 1].id, 1, line + 1, sum); return ; }
if (mp[i][j]) { dfs(i, j + 1, line, sum); return; }
for (rg int x = 1; x <= 9; ++x) {
if (Line[i][x]) continue;
if (Clmn[j][x]) continue;
if (Palc[p[i][j]][x]) continue;
Line[i][x] = Clmn[j][x] = Palc[p[i][j]][x] = 1, mp[i][j] = x;
dfs(i, j + 1, line, sum + x * s[i][j]);
Line[i][x] = Clmn[j][x] = Palc[p[i][j]][x] = 0, mp[i][j] = 0;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
for (rg int i = 1; i <= 9; ++i) a[i].id = i;
int tmp = 0;
for (rg int i = 1; i <= 9; ++i)
for (rg int j = 1; j <= 9; ++j) {
int x; read(x), mp[i][j] = x;
if (x) Line[i][x] = 1, Clmn[j][x] = 1, Palc[p[i][j]][x] = 1, ++a[i].cnt, tmp += x * s[i][j];
}
sort(a + 1, a + 10, cmp);
dfs(a[1].id, 1, 0, tmp);
printf("%d\n", ans);
return 0;
}
完结撒花 \(qwq\)
「NOIP2009」靶形数独的更多相关文章
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- 「NOIP2009」最优贸易
「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...
- 「NOIP2009」Hankson 的趣味题
Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...
- 【noip2009】靶形数独
题解: 又是搜索- - 加状态压缩剪枝 二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突 还有个很重要的剪枝 把可能使用数字最少的格子先搜索 代码: #include &l ...
- #2590. 「NOIP2009」最优贸易
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- loj2589 「NOIP2009」Hankson 的趣味题
对于质因数分解理解还不到位. 此题可知$lcm$是$x$的倍数,$x$是$lcm$的约数,只要在$lcm$的分解质因数里对每一个质因子讨论种数即可. 具体来说,对于$lcm$的一个质因子$p$,讨论$ ...
- 「NOIP2009」Hankson的趣味题
题目描述 (由于本题是数论题,所以我只把题目大意说一下...) 输入时给定\(a_0,a_1,b_0,b_1\),题目要求你求出满足如下条件的\(x\)的个数: \[\begin{cases}\gcd ...
- 靶形数独 (dfs+预处理+状态压缩)
#2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
随机推荐
- matplotlib学习(2)
1.legend的学习(图例)1.1 代码 import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) #从-1 ...
- 在Visual Studio 2017中,.NET(C#)通过Oracle.ManagedDataAccess来连接Oracle数据库
C#如何通过Oracle.ManagedDataAccess来连接Oracle数据库 1.先创建一个项目,鼠标右击项目中的引用,再点击管理NuGet程序包(也可以先下载dll文件,再选添加引用),在搜 ...
- 用js实现复制内容到操作系统粘贴板(兼容IE、谷歌、火狐等浏览器)
一.如果只考虑IE浏览器,可以直接用原声js实现 if(window.clipboardData){ //清空操作系统粘贴板 window.clipboardData.clearData(); //将 ...
- Chrome 打不开任意网页以及设置、扩展程序等页面解决方法
解决办法:在快捷键加启动参数 -no-sandbox,如果可以启动,就说明是电脑上有某个软件与Chrome沙盒有冲突
- Practical aspects of deep learning
If your Neural Network model seems to have high variance, what of the following would be promising t ...
- Plastic Bottle Manufacturer - What Is The Direction Of Plastic Bottles?
Plastic bottle manufacturers explain: protective packaging for cosmetic cleaning products requires b ...
- Java基础知识笔记第三章:运算符表达式语句
算术运算符与表达式 操作符 描述 例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * ...
- 关于Action模型驱动无法获取属性的问题
这两天在练习ssh小项目发现action层怎都无法获取Ajax传过来的json: 1.检查表单name和action定义属性名是否一致 2.get/Set方法 3.表单和属性名的命名问题,驼峰法
- 第1节 Scala基础语法:1、2、概述,什么是scala
Scala编程 1. 课程目标 1.1. 目标1:熟练使用scala编写Spark程序 1.2. 目标2:动手编写一个简易版的Spark通信框架 1.3. 目标3:为阅读Spark内核源码 ...
- C++中函数访问数组的方式
在书写C++代码时,往往为了令代码更加简洁高效.提高代码可读性,会对定义的函数有一些特殊的要求:比如不传递不必要的参数,以此来让函数的参数列表尽可能简短. 当一个函数需要访问一个数组元素时,出于上述原 ...