[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) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
 
随机推荐
- Mac OS X:在标题栏上显示目录完整路径
			
众所周知mac的finder是不带路径显示的,你进入某个文件夹只会显示当前文件夹的名字而已.虽然你可以在finder的菜单栏中点“显示”-“显示路径栏”把路径栏调出来,但是这样只会不必要的增加find ...
 - 12c pdb expdp  use DATA_PUMP_DIR meet ORA-39145
			
ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-39087: directory name DATA_ ...
 - jsp的简介
			
https://www.w3cschool.cn/jsp/jsp-intro.html
 - MVP架构模式
			
概念解释 MVP是Model(数据) View(界面) Presenter(表现层)的缩写,它是MVC架构的变种,强调Model和View的最大化解耦和单一职责原则 Model:负责数据的来源和封装, ...
 - SharePoint2013升级SP1后,运行配置向导报错:未注册sharepoint服务
			
SharePoint Server 2013 升级SP1后,需要重新运行配置向导,但是运行过程中报错:未注册sharepoint服务. 日志详细错误信息: 已引发类型为 Microsoft.Share ...
 - 使用Dotfuscator保护.NET DLL加密DLL,防止DLL反编译
			
1.下载地址 https://pan.baidu.com/s/1ztWlBxw1Qf462AE7hQJQRg 2.操作步骤 2.1安装后打开DotfuscatorPro软件,如下图所示: 2.2 选择 ...
 - jvm 脑图
 - idea下关联spark源码环境(转)
			
0.环境: java 1.8 scala 2.11.8 maven 3.5.0 idea 2017 spark 2.2.0 1完成以下配置 java环境变量 scala环境变量 maven setti ...
 - linux下安装mysql5.7.21
			
下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz 解压 ...
 - 网站推广--Html关键词代码解说
			
html的meta标签 1. meta标签是内嵌在你网页中的特殊html标签,包含着你有关于你网页的一些隐藏信息.Meat标签的作用是向搜索引擎解释你的网页是有关哪方面信息的.对于高级的搜索引擎来说, ...