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

我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜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. Delphi初始化与结束化

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. 分享一个根据具体的日期判断星座的PHP函数

    其实原理很简单,也就是把所有的星座月份日期范围存储到一个数组中,然后根据日期判断属于哪个范围,这样就得到是哪个星座了. 下面的这个函数写的比较精炼,可以参考一下 function constellat ...

  3. Makefile中wildcard的介绍

    在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTER ...

  4. ssh安装和使用

    1.基础知识 ssh用于远程登陆,linux默认安装了client,如果需要被登陆则需要安装 server 2.安装 apt-get install openssh-server 检查是否安装成功 a ...

  5. linux中常用命令总结

    一关机/重启/注销 关机 shutdown -h now //立即关机 重启 shutdown -r now //立即重启 reboot 重新启动 注销 logout //退出注销当前用户窗口 exi ...

  6. REPLACE(替换字段内容)

    语法: REPLACE <str1> WITH <str2> INTO <c> [LENGTH <l> ]. ABAP/4 搜索字段 <c> ...

  7. 20145202马超 2016-2017-2 《Java程序设计》第一次实验

    之前做的(http://www.cnblogs.com/tuolemi/p/5707098.html) 其余的 断点的使用 行断点 条件断点 参考(http://www.cnblogs.com/roc ...

  8. JAVA大作业汇总3

    JAVA大作业3 代码 ``` package thegreatwork; import java.util.; import java.io.; /Board.java 目的:里面有一些关于如何移动 ...

  9. WPF 构建无外观(Lookless)控件

    原文:WPF 构建无外观(Lookless)控件 构建一个用户可以使用Template属性设置外观的WPF控件需要以下几步 1.继承自System.Windows.Controls.Control 2 ...

  10. WPF中的数据模板(DataTemplate)

    原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate)                                                   ...