[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 博士拿出了他最近发明的“靶形数独 ...
随机推荐
- CF788A Functions again dp
求一个最长子段和就完了,可以出T1? code: #include <bits/stdc++.h> #define N 100006 #define ll long long #defin ...
- python 关键参数和默认值
def hello_key(greeting='hello', name='world'): print('%s, %s' % (greeting, name)) hello_key() hello_ ...
- 2019.7.9 校内测试 T3 15数码问题
这一次是交流测试?边交流边测试(滑稽 15数码问题 大家应该都玩过这个15数码的游戏吧,就在桌面小具库那里面哦. 一看到这个题就知道要GG,本着能骗点分的原则输出了 t 个无解,本来以为要爆零,没想到 ...
- HDU 1257 最少拦截系统 ——(LIS)
想了一下感觉和lis有关,交了果然AC.想不到很好的证明方法,试做证明如下:lis的每一个点都是一个不上升系统中的一员,设其为a[i],那么a[i-1]<a[i]肯定是成立的(lis的性质),夹 ...
- windows环境rabbitmq安装步骤
windows环境rabbitmq安装步骤: 1 提前安装erl; 2 rabbitmq安装后自动启动; 3 从开始菜单进入rabbit命令窗,启用插件; 下面是命令: 启用插件 rabbitmq ...
- Linux设备驱动程序 之 per-cpu变量
数组形式 支持SMP的现代操作系统使用每个cpu上的数据,对于给定的处理器其数据是唯一的:一般来说,每个cpu的数据存放在一个数组中,数组总的每一项对应着系统上的一个存在的处理器:按当前处理器号确定这 ...
- Nginx 之 Location 的整理
1. Location 的整理 在将配置解析完后,所有的 location 此时都以 tree 的形式组织起来,具体可参考 Nginx之 Location 的生成. 此时需要对所有 server 下的 ...
- CXF框架构建和开发 Services
Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP.POST/HTTP.RESTful ...
- .md 即 markdown 文件的基本常用编写语法
0. 前言 Markdown 是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.现在的项目都使用了 git 仓库,再加上远程仓库 github 托管,那就难免要写一些 ...
- 跨域form下载方式 批量下载
downloadFileForm:function(fid) { var url = "https://file.xxxx.com/fileDownload.do"; var in ...