靶形数独

题目链接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. JavaMail使用SMTP协议发送电子邮件(详解)

    Properties props = new Properties(); props.setProperty("mail.transport.protocol", "sm ...

  2. vue 内容增加滚动条自动定位至底部

    this.$nextTick(() => { document.body.scrollTop = document.body.scrollHeight; console.log(document ...

  3. MySQL实现计算两点之间的距离

    DELIMITER $$ CREATE FUNCTION `calculateLineDistance`(startLng double, startLat double, endLng double ...

  4. 网络1911、1912 C语言第4次作业--函数批改总结

    目录 网络1911.1912 C语言第4次作业--函数批改总结 一.评分规则 二.本次作业亮点 三.本次作业存在的问题 四.助教有话说 五.得分详情 网络1911.1912 C语言第4次作业--函数批 ...

  5. mac: jenkins+ant+jmeter接口测试

    最近研究Jenkins平台上使用ant进行集成测试,在网上查阅了很多资料,将 jenkins+ant+jmeter简单使用方法记录下来,方便以后查阅.有很多不足之处,后期不断优化. 一.环境搭建 1. ...

  6. tomcat控制前台到后台的乱码问题

    1.找到tomcat中的conf文件下的server.xml文件. 2.点击打开后找到 <Connector  port="8080" protocol="HTTP ...

  7. Jenkins在H5编译加密过程中一个报错

    ################################ 背景:开发环境在编译H5的时候出现了以下报错,记录下 ################################ D:\Jenk ...

  8. Robot Framework(十九) 附录

    6附录 6.1测试数据中的所有可用设置 6.1.1设置表 Setting表用于导入测试库,资源文件和变量文件,以及定义测试套件和测试用例的元数据.它可以包含在测试用例文件和资源文件中.请注意,在资源文 ...

  9. easyui-combobox和C标签判断回显

    <td width="40%"> <select class="easyui-combobox" id="work_property ...

  10. Qt for Android (二) Qt打开android的相册

    以下有一个可以用的Demo https://files.cnblogs.com/files/wzxNote/Qt-Android-Gallery-master.zip 网盘地址: https://pa ...