[LuoguP1074]靶形数独_搜索
靶形数独
题目链接:https://www.luogu.org/problem/P1074
数据范围:略。
题解:
传说中的大爆搜题啊。
我觉得这种题就是你能想到什么优化就直接上什么优化....
这个题我们就贪心的选行,就是按照每行$0$的个数从小到大排序依次填。
然后我们填的时候需要记录:当前要填的数,在行、列、九宫格里是否出现过即可。
还有,分数是$5\sim 10$,不是$1$到$5$.....
代码:
#include <bits/stdc++.h>
#define N 110
using namespace std;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
struct Node {
int x, y;
};
inline bool cmp(const Node &a, const Node &b) {
return a.y < b.y;
}
const int n = 9;
inline int id(Node a) {
return n * (a.x - 1) + a.y;
}
inline int id(int x, int y) {
return n * (x - 1) + y;
}
inline Node rz(int x) {
return (Node) {(x - 1) / n + 1, (x - 1) % n + 1};
}
inline int bid(int al) {
int x = rz(al).x, y = rz(al).y;
x = (x - 1) / 3 + 1, y = (y - 1) / 3 + 1;
return (x - 1) * 3 + y;
}
int Map[N], q[N], Score[N], ans = 0, fil[N];
bool vis[3][10][10];
Node b[11];
void dfs(int k) {
if (k == 82) {
// puts("??");
int sum = 0;
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
sum += fil[id(i, j)] * Score[id(i, j)];
}
}
// for (int i = 1; i <= n; i ++ ) {
// for (int j = 1; j <= n; j ++ ) {
// printf("%d ", fil[id(i, j)]);
// }
// puts("");
// }
// puts("");
ans = max(ans, sum);
return;
}
int x = rz(q[k]).x, y = rz(q[k]).y;
// printf("%d %d\n", x, y);
if (!Map[id(x, y)]) {
for (int i = 1; i <= 9; i ++ ) {
// x, y, i
if (!vis[0][x][i] && !vis[1][y][i] && !vis[2][bid(id(x, y))][i]) {
vis[0][x][i] = vis[1][y][i] = vis[2][bid(id(x, y))][i] = true;
fil[id(x, y)] = i;
dfs(k + 1);
vis[0][x][i] = vis[1][y][i] = vis[2][bid(id(x, y))][i] = false;
fil[id(x, y)] = 0;
}
}
}
else {
dfs(k + 1);
}
}
int main() {
for (int i = 1; i <= 9; i ++ ) {
for (int j = 1; j <= 9; j ++ ) {
Map[id(i, j)] = rd();
}
}
for (int i = 1; i <= 9; i ++ ) {
b[i].x = i;
for (int j = 1; j <= 9; j ++ ) {
int v = Map[id(i, j)];
if (!v)
b[i].y ++ ;
else {
vis[0][i][v] = vis[1][j][v] = vis[2][bid(id(i, j))][v] = true;
fil[id(i, j)] = v;
}
}
}
sort(b + 1, b + n + 1, cmp);
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
int x = b[i].x, y = j;
q[id(i, j)] = id(x, y);
}
}
// init_score
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
Score[id(i, j)] = 5;
}
}
for (int i = 1; i <= 5; i ++ ) {
int x = i, y = n - i + 1;
for (int l = x; l <= y; l ++ ) {
for (int r = x; r <= y; r ++ ) {
Score[id(l, r)] ++ ;
}
}
}
// for (int i = 1; i <= n; i ++ ) {
// for (int j = 1; j <= n; j ++ ) {
// printf("%d ", Score[id(i, j)]);
// }
// puts("");
// }
dfs(1);
if (!ans) {
puts("-1");
}
else {
cout << ans << endl ;
}
return 0;
}
[LuoguP1074]靶形数独_搜索的更多相关文章
- [luoguP1074] 靶形数独(搜索)
传送门 75分,太菜,不会优化了,吐了. 几点优化. 1.先搜索容易确定的位置 2.从中心往周围搜 3.枚举数字的时候倒序枚举 4.如果没有枚举到的数字都是最优情况的话也不能比当前ans大就剪枝 5. ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- Luogu P1074靶形数独【搜索/剪枝】By cellur925
题目传送门 显然是一个搜索.但是开始没有任何的剪枝,暴力从\((1,1)\)点开始搜索,很自然地T了6个点. #include<cstdio> #include<algorithm& ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 靶形数独 2009年NOIP全国联赛提高组(搜索)
靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小城和小华都是热爱数 ...
- [COGS 0407][NOIP 2009] 靶形数独
407. [NOIP2009] 靶形数独 ★★ 输入文件:sudoku.in 输出文件:sudoku.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
随机推荐
- 006_STM32程序移植之_SYN6288语音模块
1. 测试环境:STM32C8T6 2. 测试模块:SYN6288语音模块 3. 测试接口: SYN6288语音模块: VCC------------------3.3V GND----------- ...
- tinymce+粘贴word图片例子
tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...
- bbs-admin-自定义admin(二)
本文内容 目的:模仿admin默认配置,自定义配置类 一 查 1 查看数据 2 查看表头 3 分页器 4 search(搜索框) 5 action(批量处理) 6 filter(分类) ...
- 【概率论】3-1:随机变量和分布(Random Variables and Discrete Distributions)
title: [概率论]3-1:随机变量和分布(Random Variables and Discrete Distributions) categories: Mathematic Probabil ...
- 在C语言中破坏函数调用堆栈
// 这段代码显示,在C语言修改函数的返回地址 int test1() { ; } int test2(int a) { *(&a-) = (int)test1; // 将返回地址修改为tes ...
- 面向对象(OOP)笔记
1.本质:以类的方式组织代码,以对象的方式组织(封装)数据 2.对象:是具体的事物 3.类:是对对象的抽象(抽象 抽出象的部分) 先有具体的对象,然后抽象各个对象之间象的部分,归纳出类 通过类再认识其 ...
- 7.26T3小游戏
小游戏 题目描述 有一个简单的小游戏.游戏的主人公是一个勇士,他要穿过一片黑森林,去 解救公主.黑森林的地图可以用一张 V 个点.E 条边的无向图来描述,起点是 1 号点,终点是 V 号点.勇士从起点 ...
- Sign APK without putting keystore info in build.gradle
http://stackoverflow.com/questions/20562189/sign-apk-without-putting-keystore-info-in-build-gradle/2 ...
- 子线程里调用performSelector需要注意什么
以下代码执行顺序是什么 ? - (void)action { NSLog(@"1"); dispatch_queue_t queue = dispatch_get_global_q ...
- legend3---lavarel常用操作代码2
legend3---lavarel常用操作代码2 一.总结 一句话总结: 对于王思cong被执法人的感悟:失意时 莫心伤,得意时 莫膨胀 1.lavarel自动事务? DB::transaction方 ...