靶形数独

题目链接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. webservice应用+建议不用webservice

    webservice应用 1.分布式应用的集成(应用程序之间的集成) 2.软件重用 将一个软件的功能以webservice方式暴露出来,达到软件重用.例如上边分析天气预报,将天气查询功能以webser ...

  2. python 赋值魔法

    序列解包: >>> x,y,z = 1, 2, 3>>> print(x, y, z)1 2 3 >>> a,b, *reset = [1,2,3 ...

  3. 【luogu1468】[Violet]蒲公英--求区间众数

    题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

  4. 【概率论】4-4:距(Moments)

    title: [概率论]4-4:距(Moments) categories: - Mathematic - Probability keywords: - Moments - Moments Gene ...

  5. Egyptian Collegiate Programming Contest (ECPC 2015)

    题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...

  6. HDU 1114 Piggy-Bank ——(完全背包)

    差不多是一个裸的完全背包,只是要求满容量的最小值而已.那么dp值全部初始化为inf,并且初始化一下dp[0]即可.代码如下: #include <stdio.h> #include < ...

  7. 了解Spring Boot的自动配置

    摘自:https://www.jianshu.com/p/ddb6e32e3faf Spring Boot的自动配置给开发者带来了很大的便利,当开发人员在pom文件中添加starter依赖后,mave ...

  8. 重读APUE(10)-中断的系统调用

    如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行:该系统调用返回出错,其errno设置为EINTR: 系统将系统调用分成两类:低速系统调用和其他系统调用:低 ...

  9. spark-submit 参数总结

    spark-submit 可以提交任务到 spark 集群执行,也可以提交到 hadoop 的 yarn 集群执行. 1)./spark-shell --help   :不知道如何使用,可通过它查看命 ...

  10. RotateDrawable

    用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000 相关属性如下: fromDegrees:起始的角度,,对应最低的level值,默认为0 toDegrees ...