「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博士拿出了他最近发明 ...
随机推荐
- 【代码总结】PHP面向对象之抽象类
一.什么是抽象方法? 一个方法如果没有方法体(不使用"{}",直接使用分号结束的方法,才是没有方法体的方法),则这个方法就是抽象方法 1.声明一个方法,不使用{},而直接分号结束 ...
- 杭电 2136 Largest prime factor(最大素数因子的位置)
Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- leetcode 0209
目录 ✅ 500. 键盘行 描述 解答 ✅ 905. 按奇偶排序数组 描述 解答 py sorted 参数详解 ✅ 559. N叉树的最大深度 描述 解答 java dfs-like method(r ...
- ipfs camp course c demo exercise 1
目录 aim: my bugs 解决ipfs 的 cros 问题的方法 result final code for c1 aim: 首先咱们把 broswer 和 自己的api 连接起来(要显示出来自 ...
- MySQL 之数据库初识
一 数据库概述 数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的.过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用. 数据库是长期存放在计算机内.有组 ...
- Python3.5学习之旅——day5
模块初识 一.定义 在python中,模块是用来实现某一特定功能的代码集合.其本质上就是以‘.py’结尾的python文件.例如某文件名为test.py,则模块名为test. 二.导入方法 我们在这一 ...
- Python3.5学习之旅——day3
本节内容: 1.字符串操作 2.字典操作 3.集合 4.文件操作 5.字符编码与转码 6.函数与函数式编程 一.字符串操作 name='kobe' name.capitalize() 首字母大写 na ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:可滚动
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- BKP寄存器
STM32的BKP: 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据.他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电.当系统在待机模式下被唤醒,或系统复位或 ...
- 「SP10628 COT - Count on a tree」
主席树的综合运用题. 前置芝士 可持久化线段树:其实就是主席树了. LCA:最近公共祖先,本题需要在\(\log_2N\)及以内的时间复杂度内解决这个问题. 具体做法 主席树维护每个点到根节点这一条链 ...