【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....... 我的思路是这样的话我们可以从内到外或者从 ...
随机推荐
- hdu 4403
水水的dfs #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath& ...
- 如何优化 Android Studio 启动、编译和运行速度?
作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行开发,但使用起来有时会出现卡顿等问题.本文介 ...
- HTML字符实体(Character Entities),转义字符串(Escape Sequence)
为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...
- IOS开发之表视图(UITableView)
IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于 ...
- 李洪强iOS开发本人集成环信的经验总结_09_处理好友请求
李洪强iOS开发本人集成环信的经验总结_09_处理好友请求 实现这种效果: 01 - 遵守处理好友请求的代理协议 02 - 设置代理 03 - 实现代理方法 04 - 实现代理中用到的方法
- cocos2d-x 多分辨率适配详解(转载),以前北京团队设计的游戏,也是用这套方案
http://blog.csdn.net/kyo7552/article/details/17163487 多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案.今天我为大家介绍的是 ...
- thinkphp多表关联并且分页
$db_prefix = C('DB_PREFIX'); $Model = new Model(); $data = $Model->table("{$db_prefix}ordern ...
- linux地址映射1、2、3(☆☆☆)
欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 一.线性映射与非线性映射 ...
- [HDU 1695] GCD
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Spring data rest 如何显示主键
How to expose the resourceId with Spring-Data-Rest? Spring-Data-Rest is a quite new project in the S ...