[NOIP2009]靶形数独 深搜+枝杈优化
这道题,又是一位玄学搜索......
我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC.......
我的思路是这样的话我们可以从内到外或者从外到内搜索,这样的话我们就可以在一定程度上运用贪心,因为中间的价值大外面的价值小,我是作为一个从来没有玩过数独的人的思路...然而任何一个玩过数独的人都会先选可能状态少的优先搜索.......
对于这题里的数据,可行方案很少因此摆在我们面前的不是减去不优的解而是减去不成立的解,然而对于不成立的解在我们真正意识到他不成立之前他也许是很优的,然而我们要提前预知是否是可行解基本不可行,那么我们就还真得爆搜了,然而怎样让我们的爆搜AC而不是TLE呢:我们搜索到的深度是一定的所以我们就要让他更晚“蓬松”,对于这样一个玄学的搜搜,我们这样的策略似乎是最可行且科学的了
#include <cstdio>
namespace Pre{
inline void read(int &sum){
register char ch=getchar();
for(sum=;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=(sum<<)+(sum<<)+ch-'',ch=getchar());
}
inline int Max(int x,int y){
return x>y?x:y;
}
inline int Abs(int x){
return x<?-x:x;
}
int bin[],have[][],pos[][],val[][];
inline void Init(){
bin[]=;
for(int i=;i<=;i++)
bin[i]=bin[i-]<<;
int full=(<<)-;
for(int i=;i<=full;i++)
for(int j=;j>;j--)
if((bin[j]&i)==){
have[i][++have[i][]]=j;
}
}
int ans;
}
namespace Handle{
int line[],column[],big_lattice[],key[][];
}
namespace point{
struct Point{
int x,y;
inline friend Point operator + (Point a,Point b);
inline void operator += (Point a){
*this=(*this)+a;
}
}S,X,Z,Y,N,Queue[];
int len;
inline Point operator + (Point a,Point b){
return (Point){a.x+b.x,a.y+b.y};
}
inline void Init(){
N.x=,N.y=;
S.x=-,S.y=;
X.x=,X.y=;
Z.x=,Z.y=-;
Y.x=,Y.y=;
}
inline Point To(){
int Dis=Pre::Max(Pre::Abs(N.x-),Pre::Abs(N.y-));
if(N.y==Dis+&&N.x!=Dis+)return X;
if(N.x==Dis+&&N.y!=-Dis)return Z;
if(N.x==-Dis&&N.y!=-Dis&&N.y!=+Dis)return Y;
if(N.y==-Dis)return S;
}
inline int get_val(Point p){
int Dis=Pre::Max(Pre::Abs(p.x-),Pre::Abs(p.y-));
return -Dis;
}
inline int get_pos(Point p){
return (p.x-)/*+(p.y-)/+;
}
inline void get_queue(){
if(N.x==)return;
if(Handle::key[N.x][N.y]){
N+=To();
get_queue();
return;
}
Queue[++len]=N;
N+=To();
get_queue();
}
}
namespace Handle{
inline void Insert(point::Point p,int Key){
using Pre::bin;
using Pre::pos;
key[p.x][p.y]=Key;
line[p.x]|=bin[Key];
column[p.y]|=bin[Key];
big_lattice[pos[p.x][p.y]]|=bin[Key];
}
inline void Delete(point::Point p){
using Pre::bin;
using Pre::pos;
line[p.x]^=bin[key[p.x][p.y]];
column[p.y]^=bin[key[p.x][p.y]];
big_lattice[pos[p.x][p.y]]^=bin[key[p.x][p.y]];
key[p.x][p.y]=;
}
}
namespace Main{
void Init(){
using namespace point;
Pre::Init();
point::Init();
for(int i=;i<=;i++)
for(int j=;j<=;j++)
Pre::pos[i][j]=get_pos((Point){i,j}),
Pre::val[i][j]=get_val((Point){i,j});
for(int i=,x;i<=;i++)
for(int j=;j<=;j++)
Pre::read(x),Handle::Insert((Point){i,j},x),Pre::ans+=Pre::val[i][j]*x;
get_queue();
using namespace Handle;
using Pre::pos;
using Pre::val;
using Pre::have;
}
void dfs(int Now,int Had){
if(Now==){
Pre::ans=Pre::Max(Pre::ans,Had);
return;
}
using namespace point;
using namespace Handle;
using Pre::pos;
using Pre::val;
using Pre::have;
int Can=line[Queue[Now].x]|column[Queue[Now].y]|big_lattice[pos[Queue[Now].x][Queue[Now].y]];
for(int i=;i<=have[Can][];i++){
Handle::Insert(Queue[Now],have[Can][i]);
dfs(Now-,Had+have[Can][i]*val[Queue[Now].x][Queue[Now].y]);
Handle::Delete(Queue[Now]);
}
}
inline void Work(){
int HAD=Pre::ans;
dfs(point::len,HAD);
if(point::len!=&&HAD==Pre::ans)Pre::ans=-;
}
}
int main(){
freopen("sudoku.in", "r", stdin);
freopen("sudoku.out", "w", stdout);
Main::Init();
Main::Work();
printf("%d",Pre::ans);
return ;
}
[NOIP2009]靶形数独 深搜+枝杈优化的更多相关文章
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- NOIP2009靶形数独
题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- Vijos1775 CodeVS1174 NOIP2009 靶形数独
靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...
- [NOIP2009] 靶形数独 骚气的大爆搜
这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...
随机推荐
- Python函数中的参数
形参:形式参数 实参:实际参数 1.普通参数:严格按照顺序将实参赋值给形参. 2.默认参数:必须放置在参数列表的最后. 3.指定参数:将实参赋值给制定参数. 4.动态参数: *:默认将传入的参数,全部 ...
- Python爬虫基础(一)——HTTP
前言 因特网联系的是世界各地的计算机(通过电缆),万维网联系的是网上的各种各样资源(通过超文本链接),如静态的HTML文件,动态的软件程序······.由于万维网的存在,处于因特网中的每台计算机可以很 ...
- Python学习:3.Python学习基础
Python基础概念 一.编码 Python解释器加载.py文件中的代码的时候,对内容进行编码,在Python2.x中默认使用的是ASCII,因此我们使用Python2.x版本输出中文的时候,会出现以 ...
- FPGA算法学习(1) -- Cordic(圆周系统之向量模式)
旋转模式用来解决三角函数,实现极坐标到直角坐标的转换,基础理论请参考Cordic算法--圆周系统之旋转模式.那么,向量模式则用来解决反三角函数的问题,体现的应用主要是直角坐标向极坐标转换,即已知一点的 ...
- 1.使用pycharm搭建开发调试环境【转】
感谢 feigamesnb 第一步:安装python2.7环境 去https://www.python.org/downloads/下载windows版本的python,选择2.7版本,按提示安装,并 ...
- 根据生产场景对Linux系统进行分区
转自:http://oldboy.blog.51cto.com/2561410/629558 老鸟谈生产场景如何对linux系统进行分区? █ 前言: 我们买房子时,会考虑1室1厅,2室1厅, ...
- 【jQuery】 资料
[jQuery] 资料 1. 选择器 http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 2. 事件 http://www.w3sch ...
- 最火的.NET开源项目[转]
综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管理( ...
- VM实例的生命周期管理
有的操作功能比较类似,也有各自的适用场景,简单介绍下上述几个重要的操作: 常规操作: 常规操作中,Launch.Start.Reboot.Shut Off 和 Terminate 都很好理解. 下面几 ...
- Cross Entropy in Machine Learning
整理摘自:https://blog.csdn.net/tsyccnh/article/details/79163834 信息论 Outline 1. 信息量与信息熵 2. 相对熵(KL散度) 3. 交 ...