传送门

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. traceback说明

    一:traceback说明 该模块提供了一个标准接口来提取,格式化和打印Python程序的堆栈跟踪.它完全模仿Python解释器在打印堆栈跟踪时的行为.当您想要在程序控制下打印堆栈跟踪时,这很有用. ...

  2. git 使用点

    git checkout   HEAD   只是缓存恢复到head 头版本,文件还没恢复,最后要执行 git checkout .   (点) 才能恢复文件内容 git checkout     只是 ...

  3. jQuery结合CSS实现手风琴组件(2)----利用seajs实现静态资源模块化引入

    1. 目录结构(webStrom) 2. 代码 1.html <!DOCTYPE html> <html lang="en"> <head> & ...

  4. dojo框架笔记

    一.模块定义 1.定义只含值对,没有任何依赖的模块(moudle1.js) define({ color: "black", size: "unisize" } ...

  5. springboot 打包成jar

    1.pom.xml配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  6. 修复GRUB引导故障!

    故障原因:MBR中的GRUB引导程序遭到破坏,grub.conf文件丢失,引导配置有误 故障现象:系统引导停滞,显示“grub>”提示符 解决思路:若无MBR备份,进入急救模式,重新安装grub ...

  7. BinaryTree(二叉树) - 再谈二叉树

    经过两天的研究,总算是完全梳理清二叉树的基本操作了,然后我又发现了一些对二叉树的新的认识. 先具体说说删除操作,前面在对二叉树的补充中,我说到了二叉树的删除操作可以有两种不同的代码编写方式(可点这里去 ...

  8. Android Studio中 安卓模拟器 联网

    方案一:之前做测试的时候发现虚拟机无法联网(浏览器打开 www.baidu.com, 显示 403 forbidden): 解决方案:关闭已经打开的虚拟机,进入到 SDK 安装目录下,按住 shift ...

  9. redhat7.6 httpd配置php模块

    1.安装php yum install "*php*"   -y 2.编辑httpd.conf配置文件 找到LoadModule foo_module modules/mod_fo ...

  10. pandas 存储文件到MySQL 以及读取

    pandas导入数据到MySQL 1.导入必要的库 2.创建链接 3.导入数据 import pandas as pd from sqlalchemy import create_engine con ...