[luoguP1074] 靶形数独(搜索)
75分,太菜,不会优化了,吐了。
几点优化。
1.先搜索容易确定的位置
2.从中心往周围搜
3.枚举数字的时候倒序枚举
4.如果没有枚举到的数字都是最优情况的话也不能比当前ans大就剪枝
5.位运算
#include <cstdio>
#include <iostream>
#include <algorithm>
#define max(x, y) ((x) > (y) ? (x) : (y))
#define tu(i, j) (((i) - 1) / 3 * 3 + ((j) - 1) / 3 + 1) int ans = -1, cnt;
int hang[10], lie[10], jiu[10], shu[10], a[10][10], num[10][10], point[11]; struct node
{
int pt, x, y, z;
node(int pt = 0, int x = 0, int y = 0, int z = 0) : pt(pt), x(x), y(y), z(z) {}
}p[101]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline bool cmp(node x, node y)
{
return x.z > y.z || (x.z == y.z && x.pt > y.pt);
} inline int pd(int x, int y)
{
if(x == 1 || x == 9 || y == 1 || y == 9) return 6;
if(x == 2 || x == 8 || y == 2 || y == 8) return 7;
if(x == 3 || x == 7 || y == 3 || y == 7) return 8;
if(x == 4 || x == 6 || y == 4 || y == 6) return 9;
return 10;
} inline bool check(int sum)
{
int i, j, k, top;
k = 10;
top = point[k];
for(i = 9; i >= 1; i--)
for(j = 1; j <= 9 - shu[i]; j++)
if(top) top--, sum += i * k;
else
{
while(!top && k > 6) k--, top = point[k];
top--;
sum += i * k;
}
return sum > ans;
} inline void dfs(int x, int y, int k, int sum)
{
if(k > cnt)
{
ans = max(ans, sum);
return;
}
for(int i = 9; i >= 1; i--)
if(!(hang[x] & (1 << i - 1)) && !(lie[y] & (1 << i - 1)) && !(jiu[tu(x, y)] & (1 << i - 1)))
{
shu[i]++;
point[pd(x, y)]--;
lie[y] |= 1 << i - 1;
hang[x] |= 1 << i - 1;
jiu[tu(x, y)] |= 1 << i - 1;
if(check(sum + p[k].pt * i)) dfs(p[k + 1].x, p[k + 1].y, k + 1, sum + p[k].pt * i);
jiu[tu(x, y)] ^= 1 << i - 1;
hang[x] ^= 1 << i - 1;
lie[y] ^= 1 << i - 1;
point[pd(x, y)]++;
shu[i]--;
}
} int main()
{
int i, j, k, l, x, sum = 0;
point[6] = 32;
point[7] = 24;
point[8] = 16;
point[9] = 8;
point[10] = 1;
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
{
shu[a[i][j] = read()]++;
sum += a[i][j] * pd(i, j);
if(a[i][j])
{
point[pd(i, j)]--;
lie[j] |= 1 << a[i][j] - 1;
hang[i] |= 1 << a[i][j] - 1;
jiu[tu(i, j)] |= 1 << a[i][j] - 1;
}
}
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
{
for(k = 1; k <= 9; k++)
if(a[i][k] && k != j)
num[i][j]++;
for(k = 1; k <= 9; k++)
if(a[k][j] && k != i)
num[i][j]++;
for(k = 1; k <= 9; k++)
for(l = 1; l <= 9; l++)
if(tu(i, j) == tu(k, l) && a[k][l] && !(i == k && j == l))
num[i][j]++;
}
for(i = 1; i <= 9; i++)
for(j = 1; j <= 9; j++)
if(!a[i][j])
p[++cnt] = node(pd(i, j), i, j, num[i][j]);
std::sort(p + 1, p + cnt + 1, cmp);
dfs(p[1].x, p[1].y, 1, sum);
printf("%d\n", ans);
return 0;
}
[luoguP1074] 靶形数独(搜索)的更多相关文章
- [LuoguP1074]靶形数独_搜索
靶形数独 题目链接:https://www.luogu.org/problem/P1074 数据范围:略. 题解: 传说中的大爆搜题啊. 我觉得这种题就是你能想到什么优化就直接上什么优化.... 这个 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 靶形数独 2009年NOIP全国联赛提高组(搜索)
靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小城和小华都是热爱数 ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- 【CodeVS】p1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...
- 靶形数独 (codevs 1174)题解
[问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“ ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
随机推荐
- Activity状态图、生命周期图(超详细),onSaveInstanceState只保存、恢复基本ui数据,持久数据不在这里保存。
1.Activity状态图 2.Activity生命周期简图 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入running ...
- Normal equations 正规方程组
前面我们通过Gradient Descent的方法进行了线性回归,但是梯度下降有如下特点: (1)需要预先选定Learning rate: (2)需要多次iteration: (3)需要Feature ...
- .Net应用自定义鼠标样式
(调用系统API的方法) 1.引用命名空间 using System.Runtime.InteropServices; 命名空间提供各种各样支持 COM 互操作 及平台调用服务的成员.using Sy ...
- JS操作CSS
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 归并排序算法及其JS实现
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(con ...
- spring-mvc hello world (1)
我学习一个程序,都是从DEMO开始的. 先不了解SPRING-MVC的原理,但一些小的概念还是需要了解的.由于之前有过SSH的工程经验,故基本的东东,不在叙述. 1.准备环境 JAR包:
- 重装macOS环境配置笔记
由于早些年买mac的时候写代码的经验还不够,导致多年使用后mac上装满了乱七八糟的软件,比如python就有系统自带的,xcode里的,pyenv的,以及brew安装的各种版本,nginx,Apach ...
- iOS Cell异步图片加载优化,缓存机制详解
最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载, ...
- codeforces_D. Social Circles
http://codeforces.com/contest/1060/problem/D 题意: n个客人,每个客人希望自己左边空li个座位,右边空ri个座位,可以形成任意个圆,问最少多少个座位. 思 ...
- hystrix 解决服务雪崩效应
1.服务雪崩效应 默认情况下tomcat只有一个线程池去处理客户端发送的所有服务请求,这样的话在高并发情况下,如果客户端所有的请求堆积到同一个服务接口上, 就会产生tomcat的所有线程去处理该服务接 ...