【noip2009】靶形数独
题解:
又是搜索- - 加状态压缩剪枝
二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突
还有个很重要的剪枝 把可能使用数字最少的格子先搜索
代码:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using std::sort;
const int N=,n=,val[][]={{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}};
struct info{
int x,y,z;
info(const int a=,const int b=,const int c=):
x(a),y(b),z(c){}
}im[][],v[N];
int map[][],xx[],yy[],zz[],ans,maxans,rem;
inline bool cmp(info a,info b){ return a.z>b.z || (a.z==b.z && a.x<b.x) || (a.z==b.z && a.x==b.x && a.y<b.y); }
void print(int t){
printf("%d",t);
exit();
}
void makeim(){
for (int i=;i<=n;i++)
for (int j=;j<=n;j++){
im[i][j].x=i;
im[i][j].y=j;
if (i<=){
if (j<=) im[i][j].z=;
else if (j<=) im[i][j].z=;
else im[i][j].z=;
}else if (i<=){
if (j<=) im[i][j].z=;
else if (j<=) im[i][j].z=;
else im[i][j].z=;
}else{
if (j<=) im[i][j].z=;
else if (j<=) im[i][j].z=;
else im[i][j].z=;
}
}
}
void makexyz(){
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (map[i][j]){
if ((xx[im[i][j].x]>>(map[i][j]-))&) print(-);
if ((yy[im[i][j].y]>>(map[i][j]-))&) print(-);
if ((zz[im[i][j].z]>>(map[i][j]-))&) print(-);
xx[im[i][j].x]|=<<(map[i][j]-);
yy[im[i][j].y]|=<<(map[i][j]-);
zz[im[i][j].z]|=<<(map[i][j]-);
}
}
void makev(){
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) v[(i-)*n+j]=info(i,j,val[i][j]);
sort(v+,v+,cmp);
}
bool check(int x,int y,int z){
--z;
if ((xx[im[x][y].x]>>z)&) return ;
if ((yy[im[x][y].y]>>z)&) return ;
if ((zz[im[x][y].z]>>z)&) return ;
return ;
}
void add(int x,int y,int z,int bo){
--z;
xx[im[x][y].x]+=bo*(<<z);
yy[im[x][y].y]+=bo*(<<z);
zz[im[x][y].z]+=bo*(<<z);
}
int getsave(int t){
int res=;
for (;t;t>>=) res+=t&;
return res;
}
void search(){
if (ans+rem*<=maxans) return;
int x=,y,z=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (!map[i][j]){
int save=getsave(xx[im[i][j].x]|yy[im[i][j].y]|zz[im[i][j].z]);
if (save==) return;
if (save>z) z=save,x=i,y=j;
}
if (!x){
if (maxans<ans) maxans=ans;
return;
}
for (int i=;i;i--)
if (check(x,y,i)){
rem-=i;
ans+=i*val[x][y];
add(x,y,i,);
map[x][y]=i;
search();
map[x][y]=;
add(x,y,i,-);
ans-=i*val[x][y];
rem+=i;
}
}
int main(){
rem=*;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++){
scanf("%d",&map[i][j]);
rem-=map[i][j];
ans+=map[i][j]*val[i][j];
}
makeim();
makexyz();
makev();
search();
if (maxans) print(maxans);
puts("-1");
}
【noip2009】靶形数独的更多相关文章
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- NOIP2009靶形数独
题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...
- [NOIP2009] 靶形数独(搜索)
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- Vijos1775 CodeVS1174 NOIP2009 靶形数独
靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...
- [NOIP2009] 靶形数独 骚气的大爆搜
这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...
- [NOIP2009]靶形数独 深搜+枝杈优化
这道题,又是一位玄学搜索...... 我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC....... 我的思路是这样的话我们可以从内到外或者从 ...
随机推荐
- 浏览器对象模型(BOM)
BOM结构 用户浏览网页的时候,浏览器会自动创建一些对象,这些对象存放着浏览器窗口的属性和相关信息,也就是大家熟称的BOM.浏览器对象模型是一个层次化的对象集,我们可以通过window对象访问所有对象 ...
- java Tomcat数据库连接池
1. 在tomcat服务器目录下面的conf中找到一个叫Context.xml的配置文件,在其中加入以下代码 <Resource name="jdbc/books" aut ...
- HDU 2992 Hotel booking(BFS+DFS 或者 SPFA+Floyd)
点我看题目 题意 : 一个司机要从1点到达n点,1点到n点中有一些点有宾馆,司机的最长开车时间不能超过10小时,所以要在10小时之内找到宾馆休息,但是为了尽快的走到n点,问最少可以经过几个宾馆. 思路 ...
- maven新建Spring MVC + MyBatis + Oracle的Web项目中pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- jquery的ajax和原始的ajax这两种方式的使用方法
jquery的ajax是对原始的ajax进行的封装,方便用户的使用.下面用代码分别举例各自的使用方式. jquery的ajax发送和接收xml数据格式. $.ajax({ type: "PU ...
- java:比较对象
对象内容相等条件:1.对象类型相同(可用instanceof操作符比较)2.对象的成员变量的值完全相同 instanceof 判断对象类型 //a是否为Child对象类型 boolean b = a ...
- Android性能优化之如何避免Overdraw
什么是Overdraw? Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布局导致一些像素会被多次绘制,而每次绘 ...
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
- Android开发之实用小知识点汇总-2
1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...
- Windows 7/8 自带定时关机命令
快捷键“Windows + R”,输入cmd打开cmd.exe程序,输入以下对应命令. 两种定时关机方式: 定时任务法 输入命令“at hh:mm shutdown -s”,Enter——添加了一 ...