这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛。做了几道什么斗地主啊啥的,感觉还是这题我还懂点。

这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西。

数独大家都了解吧:每一行,每一列,每一个九宫格都要求不一样。

我们需要预处理出:

每个点的分数(废话)。每一行中确定的数。每一列中确定的数。每一个九宫格中确定的数。以及最开始确定部分的答案。

记录每个未确定点的坐标。搜他们就好啦(倒着搜一定要。我哪知道为啥)

对于每个点,就纯循环枚举1~9就好了。当然我们要判断剪枝。

当这行有这个数的时候,return

……

以此类推。

这样就算搜到重的也一下就退回来了。

还有,记得要回溯。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 200
#define inf 0x7fffffff
#define LL long long
int a[N][N],point[N][N];
int hang[N][N],lie[N][N],ge[N][N],cnt[N][N];
int ans,basic,ji=0;
struct haha{
	int x,y;
}fei[100];
void init(){
	point[5][5]=10;
	pos(i,1,9) point[1][i]=point[9][i]=point[i][1]=point[i][9]=6;
	pos(i,2,8) point[2][i]=point[8][i]=point[i][2]=point[i][8]=7;
	pos(i,3,7) point[3][i]=point[7][i]=point[i][3]=point[i][7]=8;
	pos(i,4,6) point[4][i]=point[6][i]=point[i][4]=point[i][6]=9;
	ji=0;
	pos(i,1,3){
		pos(j,1,3){
			cnt[i][j]=++ji;
		}
	}
	ji=0;
	pos(i,1,9){
		pos(j,1,9){
			scanf("%d",&a[i][j]);
			if(a[i][j]!=0){
				basic+=a[i][j]*point[i][j];//cout<<basic<<endl;
				hang[i][a[i][j]]=1;lie[j][a[i][j]]=1;
				int temp=i/3;temp+=i%3==0?0:1;int temp2=j/3;temp2+=j%3==0?0:1;
				ge[cnt[temp][temp2]][a[i][j]]=1;
			}
			else{fei[++ji].x=i;fei[ji].y=j;}
		}
	}
}
void dfs(int last,int sum,int num){
	if(hang[fei[last].x][num]==1) return;
	if(lie[fei[last].y][num]==1) return;
	int temp=fei[last].x/3;temp+=fei[last].x%3==0?0:1;int temp2=fei[last].y/3;temp2+=fei[last].y%3==0?0:1;
	if(ge[cnt[temp][temp2]][num]==1) return;
	if(last==1){ans=max(ans,sum);return;}
	//cout<<last<<"   sum="<<sum<<"  num="<<num<<endl;
	pos(i,1,9){
		hang[fei[last].x][num]=1;lie[fei[last].y][num]=1;ge[cnt[temp][temp2]][num]=1;
		dfs(last-1,sum+(i*point[fei[last-1].x][fei[last-1].y]),i);
		hang[fei[last].x][num]=0;lie[fei[last].y][num]=0;ge[cnt[temp][temp2]][num]=0;
	}
}
int main(){
	//freopen("sudoku.in","r",stdin);
	//freopen("sudoku.out","w",stdout);
	init();
	//cout<<"ji="<<ji<<endl;
	pos(i,1,9)
		dfs(ji,i*point[fei[ji].x][fei[ji].y],i);
	if(ans==0)  cout<<"-1";
	else	cout<<basic+ans;
	return 0;
}

[NOIP2009] 靶形数独 骚气的大爆搜的更多相关文章

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

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

  2. [NOIP2009]靶形数独 题解

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

  3. [NOIP2015] 斗地主 大爆搜

    考试的时候想了半天,实在是想不到解决的办法,感觉只能暴力..然后暴力也懒得打了,小数据模拟骗30分hhh 然而正解真的是暴力..大爆搜.. 然后我的内心拒绝改这道题(TAT) 不过在wcx大佬的帮助下 ...

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

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

  5. NOIP2009 靶形数独

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

  6. NOIP2009靶形数独

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

  7. [NOIP2009]靶形数独 深搜+枝杈优化

    这道题,又是一位玄学搜索...... 我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC....... 我的思路是这样的话我们可以从内到外或者从 ...

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

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

  9. NOIP2009靶形数独(暴搜)

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

随机推荐

  1. Spring两种代理区别

    Spring的两种代理JDK和CGLIB的区别浅谈: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用invokeHandler类来处理: 而cglib动态代理是利用a ...

  2. docker中执行sed: can't move '/etc/resolv.conf73UqmG' to '/etc/resolv.conf': Device or resource busy错误的处理原因及方式

    错误现象 在docker容器中想要修改/etc/resolv.conf中的namesever,使用sed命令进行执行时遇到错误: / # sed -i 's/192.168.1.1/192.168.1 ...

  3. 前端解读Webview

    作为盛行已久的开发方式,Hybrid的相关介绍已经是相当普遍了.不过看到博客园里基本上都是从android或者ios的角度来讲解的,对于h5的前端来说看起来只能是一直半解.感觉有必要从前端的角度来理解 ...

  4. 错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server 是无法给远程连接的用户权限问题

    错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server 是无法给远程连接的用 ...

  5. mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)

    下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...

  6. 轻量级代码生成器-OnlyCoder 第二篇

    最近利用业余时间将OnlyCoder又重新打造了一番,使其使用起来更简单.更顺手. 相关的帮助文档也已发布了版本. 界面改版,UI采用了DotNetBar2组件. 还是先看下UI效果吧. 由于使用了  ...

  7. 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)

    时光荏苒,岁月如梭.楼主已经很久没有更新了.之前说好的一周一更的没有做到.实在是事出有因,没能静下心来好好看代码.当然这不能作为我不更新的理由,时间挤挤还是有的,拖了这么久,该再写点东西了,不然人就怠 ...

  8. Jmeter之分布式测试

    1)Jmeter 是纯java 应用,对于CPU和内存的消耗比较大,并且受到JVM的一些限制: 一般情况下,依据机器配置,单机的发压量为300-600,因此,当需要模拟数以千计的并发用户时,使用单台机 ...

  9. Kafka基础知识

    1. kafka是一个分布式的消息发布-订阅队列.2. 其中有一些主要的概念: Topic: 就是对放入队列的消息进行分类,分类消息分开储存,比如现在有订单消息和用户投诉消息,则分成订单topic和投 ...

  10. 对sppnet网络的理解

    前言: 接着上一篇文章提到的RCNN网络物体检测,这个网络成功的引入了CNN卷积网络来进行特征提取,但是存在一个问题,就是对需要进行特征提取图片大小有严格的限制.当时面对这种问题,rg大神采用的是对分 ...