这道题,又是一位玄学搜索......

我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜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]靶形数独 深搜+枝杈优化的更多相关文章

  1. NOIP2009靶形数独[DFS 优化]

    描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...

  2. [NOIP2009]靶形数独 题解

    407. [NOIP2009] 靶形数独 时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...

  3. NOIP2009靶形数独(暴搜)

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...

  4. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  5. NOIP2009靶形数独

    题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...

  6. [NOIP2009] 靶形数独(搜索)

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...

  7. NOIP2009 靶形数独

    4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...

  8. Vijos1775 CodeVS1174 NOIP2009 靶形数独

    靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...

  9. [NOIP2009] 靶形数独 骚气的大爆搜

    这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...

随机推荐

  1. Hadoop(2)--hdfs

    Hadoop(2) Hadoop底层封装的的是HDFS和MapReduce两种框架 在Hdfs中采用的是主从结构(Madter-slaver)就像领导和员工一样,领导负责整个公司的管理工作,而员工就负 ...

  2. mysql5.7数据库与5.7之前版本比较

    数据库初始化方式变更 <5.7 版本 mysql_install_db >5.7 版本 bin/mysqld --initialize --user =mysql --basedir=/u ...

  3. php安装php-redis扩展

    下载安装php-redis扩展: 地址:https://github.com/phpredis/phpredis/ $ wget http://pecl.php.net/get/redis-3.1.2 ...

  4. python中的字符串(str)操作

    字符串是python中数据类型.一般就单引号(‘’)或双引号(“”)引起来的内容就是字符串. 例如:下面两个都是定义字符串 str1 = "hello world" str2 = ...

  5. flask(列表实现)

    在 index/views.py 中定义视图函数 在查询的时候,如果用户分类id传0,则不添加分类查询条件 @index_blu.route('/newslist') def get_news_lis ...

  6. 002---Linux系统目录结构

    Linux系统目录结构 一切从根(/)开始,一切皆文件. /bin:存放常用的可执行文件 /sbin:存放常用的可执行文件 家目录:存放用户自己的文件或目录 root用户:/root 普通用户:/ho ...

  7. Python3 使用基本循环实现多级目录(思路)

    一.多级目录设计: 1. 通过循环的方式显示菜单和进入菜单 2. 设置标志位以提供回退上一层菜单 2. 设置标志位以提供退出程序 二.注意要点: 1. 菜单样式,层次关系不要弄混乱 2. 当输入错误时 ...

  8. cloudera manager服务迁移(scm数据库在postgresql上,其他amon,rman,oozie,metastore等在mysql上)

    公司线上大数据集群,之前用的是公有云主机,现在换成了自己idc机房机器,需要服务迁移,已下为测试: 1.备份原postgresql数据库: pg_dump -U scm scm > scm.sq ...

  9. django生产环境中部署

    https://www.cnblogs.com/chenice/p/6921727.html 本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如 ...

  10. VI的配置

    vi下设置tab键为4个空格 在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc",没有的可以新建一个.用户可以编辑它,使这些设置在 ...