[NOIP2009] 靶形数独 骚气的大爆搜
这两天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] 靶形数独 骚气的大爆搜的更多相关文章
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- [NOIP2015] 斗地主 大爆搜
考试的时候想了半天,实在是想不到解决的办法,感觉只能暴力..然后暴力也懒得打了,小数据模拟骗30分hhh 然而正解真的是暴力..大爆搜.. 然后我的内心拒绝改这道题(TAT) 不过在wcx大佬的帮助下 ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- NOIP2009靶形数独
题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...
- [NOIP2009]靶形数独 深搜+枝杈优化
这道题,又是一位玄学搜索...... 我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC....... 我的思路是这样的话我们可以从内到外或者从 ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
随机推荐
- 4.Smarty模板之间调用
{include file="header.tpl" name="cai"}
- 用php+mysql+ajax实现淘宝客服或阿里旺旺聊天功能 之 前台页面
首先来看一下我已经实现的效果图: 消费者页面:(本篇随笔) (1)会显示店主的头像 (2)当前用户发送信息显示在右侧,接受的信息,显示在左侧 店主或客服页面:(下一篇随笔) (1)在左侧有一个列表 , ...
- Ext ApplicationController&ref的使用
Ext ApplicationController&ref的使用 Ext.define('app.controller.ApplicationController', { //继承 Ext.a ...
- C# 文字转换最简单的方法
引用Microsoft.VisualBasic string text=Strings.StrConv("需要转换的文字", VbStrConv.TraditionalChines ...
- 超好用的memcache管理及可视化监控工具,真方便!
memcache做为主流的缓存数据库之一,广泛在各互联网平台使用,但是大家使用中都知道memcache目前没有一个比较好用的可视化客户端工具,每次都要输入命令进行操作,十分不方便. 而另一款主流缓存 ...
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
- jquery.validata.js 插件
一.Validate插件描述 Validate是基于jQuery的一款轻量级验证插件,内置丰富的验证规则,还有灵活的自定义规则接口,HTML.CSS与JS之间的低耦合能让您自由布局和丰富样式,支持in ...
- acm->stl
容器 queue 队列 定义 queue的定义需要两个参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型 基本方法 push(x) 入队,将x接到队列的末端 ...
- requirejs 加载其它js
基本代码: require.config({ // baseUrl : '/js/' paths: { jquery: '/js/jquery-1.11.3.min', validate: '/js/ ...
- Android事件分发理解
Android事件分发机制是个难点和重点,结合下各家,写点自己的理解.. 首先抛出一个小问题,写一个button的点击事件 button.setOnClickListener(new OnClickL ...