传送门

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」靶形数独的更多相关文章

  1. 「NOIP2009」最优贸易 题解

    「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...

  2. 「NOIP2009」最优贸易

    「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...

  3. 「NOIP2009」Hankson 的趣味题

    Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...

  4. 【noip2009】靶形数独

    题解: 又是搜索- - 加状态压缩剪枝 二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突 还有个很重要的剪枝 把可能使用数字最少的格子先搜索 代码: #include &l ...

  5. #2590. 「NOIP2009」最优贸易

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  6. loj2589 「NOIP2009」Hankson 的趣味题

    对于质因数分解理解还不到位. 此题可知$lcm$是$x$的倍数,$x$是$lcm$的约数,只要在$lcm$的分解质因数里对每一个质因子讨论种数即可. 具体来说,对于$lcm$的一个质因子$p$,讨论$ ...

  7. 「NOIP2009」Hankson的趣味题

    题目描述 (由于本题是数论题,所以我只把题目大意说一下...) 输入时给定\(a_0,a_1,b_0,b_1\),题目要求你求出满足如下条件的\(x\)的个数: \[\begin{cases}\gcd ...

  8. 靶形数独 (dfs+预处理+状态压缩)

    #2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...

  9. NOIP2009靶形数独(暴搜)

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

随机推荐

  1. ES5-Object扩展方法

    1.Object新增一个方法,Object.create();,用来以一个对象为基础创建另一个对象,新建的对象的__proto__指向基础对象  var obj = {name:'maycpou',a ...

  2. Java 中序列化与反序列化引发的思考?

    java 中序列化指从对象转变为 二进制流的过程中需要进行序列化,而反序列化指二进制流转换为java 对象.那么有的时候java 存储到数据库不需要序列化, 而计算机系统本质存储的就是二进制文件,数据 ...

  3. Maven____笔记摘抄

    1 1.maven的作用 i.增加第三方Jar (spring-context.jar spring-aop.jar ....) ii.jar包之间的依赖关系 (spring-context.jar ...

  4. IntelliJ IDEA常用快捷键大全

    如果想要非常高效的使用IDEA这款工具,应该掌握图中已被标记的快捷键. 另: 代码实时模板生成:psvm/sout/ifn等 按Tab键快速生成模板. 转载请保留或注明出处:http://www.cn ...

  5. Python学习笔记003

    windows环境配置 系统变量: Path: D:\Program Files\Python35\Scripts\; D:\ProgramFiles\Python35\; D:\Program Fi ...

  6. 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;

    6.3.4.     Scala中getClass 和 classOf Class A extends class B B b=new A    b.getClass ==classOf[A] B b ...

  7. 学习java时在要求输出的数字带俩个小数点时,利用String.format时出现的问题

    public class StringFormatDemo { public static void main(String[] args) { //String.format 实现了四舍五入 Sys ...

  8. zookeeper和eureka的区别在哪?

    zookeeper和eureka的区别在哪?传统的关系型数据库是ACID(原子性,一致性,独立性,持久性), nosql数据库是CAP(强一致性,可用性,分区容错性),分布式系统只能3进2,三个选两个 ...

  9. virtual column make sqlserver using function index

    In sqlserver, it is impossible that if we want to create an function index. Doesn`t means we can not ...

  10. Android Studio的HAXM不支持虚拟机

    因为我的计算机是服务器,不支持虚拟机,所以报这个错了. 解决方式是直接连接物理手机,打开USB调试,安装驱动,运行项目即可.