【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....... 我的思路是这样的话我们可以从内到外或者从 ...
随机推荐
- uva 10034
计算所有点之间的权值 然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...
- jquery类选择器无法取得对象问题原因
<html> <script type="text/javascript" src="jquery-1.9.1.js"></scr ...
- Stretch a row if data overflows in jasper reports
My band stretches if necessary with the following conditions, I do not know yours. I have started wi ...
- linq集合内部赋值
linq集合内部赋值 比如将一个列的值,赋值给另一列 有三种方法: 1. e.Result.ToList().ForEach(n => n.IsIntermediarybool = SetIsI ...
- zoj 3640 Help Me Escape 概率DP
记忆化搜索+概率DP 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- 深入理解JVM--JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放空间,既要写构造函数,又要写析构函数,很多时候都 ...
- nginx配置静态文件服务器
搭建文件服务器 要点就是root目录,会自动指向索引文件 如: index, index.html等 server { client_max_body_size 4G; listen 80; ## l ...
- Photoshop:路径填充边缘虚化问题
怎么才能不让它虚化呢? 解决方案一: 1.同样画出路径 2.新建图层 3.回到路径面板,右击路径图层,选择“填充路径” 4.把“羽化”设置为0,取消选择“消除锯齿” 换个背景色看看效果:一点虚化都没 ...
- LoadImage 和 BitBlt
#include <windows.h> #define WINDOWCLASS TEXT("Test") #define WNDTITLE TEXT("Te ...
- [译]再次对比TCP与UDP
免责声明:和往常一样,此文章的观点都属于‘No Bugs’Hare(译注:一个网站) ,也许不一定和翻译者或者Overload编辑的意见一致.同时,翻译者从Lapine翻译到英语也具有一定的难度.除此 ...