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

我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜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. centos7上部署新版 jumpserver 跳板机服务

    CentOS 7 建议在一个纯净的 centos7上进行下面的安装部署 关闭 selinux 和防火墙 [root@jumpserver ~]# setenforce 0 [root@jumpserv ...

  2. stm32+lwip(四):网页服务器测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  3. Go生成UUID

    Go生成UUID 在实际项目中,是经常会使用到一个唯一标识的,比如唯一标识一条记录等,使用C#得到唯一标识是很容易的.例 string guid = Guid.NewGuid().ToString() ...

  4. CONVERT TEXT(转换为可排序格式)

    可以将字符 字段转换为 可按字母顺 序排列的格 式: 语法 CONVERT TEXT <c> INTO SORTABLE CODE <sc>. 该语句为字 符字段 填充可排序 ...

  5. SELECT(データ取得)

    WHERE 句は.満たすべき条件を指定することにより選択される行数を制限します. WHERE 句は.SELECT 命令と同様に OPEN CURSOR.UPDATE.および DELETE 命令でも使用 ...

  6. Laravel框架

    curl操作: ===================================初始化$ch=curl_init() 设置请求的urlcurl_setopt($ch,CURLOPT_URL,&q ...

  7. 关于 SSH Server 的整体设定

    # . 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port # SSH 预设使用 这个 port,您也可以使用多的 port ! # 亦即重复使用 po ...

  8. 【多线程】 Task

    [多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...

  9. [网站日志]今天早上遭遇的CPU 100%情况

    今天早上9:06左右,Windows性能监视器监测到主站的Web服务器出现了CPU 100%的情况,伴随着Requests/Sec的上升,详见下图. 上图中红色线条表示的是%Processor Tim ...

  10. Java之枚举笔记(Enum)

    package com.simope.ljm; public class MyEnum { public static void main(String[] args) { System.out.pr ...