靶形数独

题目链接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]靶形数独_搜索的更多相关文章

  1. [luoguP1074] 靶形数独(搜索)

    传送门 75分,太菜,不会优化了,吐了. 几点优化. 1.先搜索容易确定的位置 2.从中心往周围搜 3.枚举数字的时候倒序枚举 4.如果没有枚举到的数字都是最优情况的话也不能比当前ans大就剪枝 5. ...

  2. [NOIP2009] 靶形数独(搜索+剪枝)

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

  3. [NOIP2009] 靶形数独(搜索)

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

  4. Luogu P1074靶形数独【搜索/剪枝】By cellur925

    题目传送门 显然是一个搜索.但是开始没有任何的剪枝,暴力从\((1,1)\)点开始搜索,很自然地T了6个点. #include<cstdio> #include<algorithm& ...

  5. 洛谷P1074 靶形数独 [搜索]

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

  6. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  7. [COGS 0407][NOIP 2009] 靶形数独

    407. [NOIP2009] 靶形数独 ★★   输入文件:sudoku.in   输出文件:sudoku.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华 ...

  8. NOIP2009靶形数独(暴搜)

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

  9. NOIP2009靶形数独[DFS 优化]

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

随机推荐

  1. Codeforces Round #590 (Div. 3)【D题:26棵树状数组维护字符出现次数】

    A题 题意:给你 n 个数 , 你需要改变这些数使得这 n 个数的值相等 , 并且要求改变后所有数的和需大于等于原来的所有数字的和 , 然后输出满足题意且改变后最小的数值. AC代码: #includ ...

  2. P2993 [FJOI2014]最短路径树问题

    思路:最短路+点分治 提交:2次 错因:更新桶的时候没有重置,而直接加上了. 题解: 对于构建最短路树,我们可以先跑最短路,然后dfs一遍连边. 然后就是点分治了,还是一些桶,存点数为\(x\)的最长 ...

  3. Vue 组件中锚点定位的问题

    1 当前组件的顶部 this.$el.scrollIntoView() 2 指定的 Element this.$el.querySelector(selector).scrollIntoView() ...

  4. MySQL5.7 (审计)通过init_connect + binlog 实现MySQL审计功能

    转载自:https://blog.51cto.com/13941177/2173620 一.简介 1.概述 mysql本身已经提供了详细的sql执行记录–general log ,但是开启它有以下几个 ...

  5. Java进阶知识19 Struts2和Spring整合在一起

    1.概述 1.Spring负责对象创建  2.Struts2负责用Action处理请求  3.整合的关键点:让Struts2框架Action对象的创建交给Spring完成. 2.整合实例 需要用到的 ...

  6. 卷积理论 & 高维FWT学习笔记

    之前做了那么多生成函数和多项式卷积的题目,结果今天才理解了优化卷积算法的实质. 首先我们以二进制FWT or作为最简单的例子入手. 我们发现正的FWT or变换就是求$\hat{a}_j=\sum_{ ...

  7. C语言学习笔记5-程序结构

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752148 作者:jadeshu   邮箱: jades ...

  8. P2663 越越的组队

    原题链接  https://www.luogu.org/problem/P2663 很容易看出来是个背包问题嘛: 体积是总分的一半,求最高分,每个同学选或不选,是个 01背包问题. 自信地交上去之后发 ...

  9. JavaWeb_(SpringMVC框架)SpringMVC入门

    Spring MVC又叫SpringWebMVC是一个轻量级的基于请求响应的表现层框架.它是Spring框架的一部分.SpringMVC与Struts2都可以替代原始Servlet技术. Spring ...

  10. Python语法 - 生成器

    生成器基本概念 1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束 2 生成器表达式能做的事情列表解析基本都能处理,只不 ...