题解:

又是搜索- - 加状态压缩剪枝

二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以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】靶形数独的更多相关文章

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

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

  2. [NOIP2009]靶形数独 题解

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

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

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

  4. NOIP2009 靶形数独

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

  5. NOIP2009靶形数独

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

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

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

  7. NOIP2009靶形数独(暴搜)

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

  8. Vijos1775 CodeVS1174 NOIP2009 靶形数独

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

  9. [NOIP2009] 靶形数独 骚气的大爆搜

    这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...

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

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

随机推荐

  1. uva 10056

    概率 Q += p*pow(1-p, i*n+k-1) i = 0,1,2,3...... #include <cstdio> #include <cmath> int mai ...

  2. firefly 环境配置所需工具

    原地址:http://www.9miao.com/question-15-59032.html http://down.9miao.com/attachment/forum/201405/19/120 ...

  3. hdu 3537 Daizhenyang's Coin 博弈论

    详见:http://www.cnblogs.com/xin-hua/p/3255985.html 约束条件6 代码如下: #include<iostream> #include<st ...

  4. UIWebView和UIWebViewDelegate的基本用法

    UIWebView和UIWebViewDelegate的基本用法 一.UIWebView主要有三种方法实现页面的装载,分别是: 1. (void)loadRequest:(NSURLRequest * ...

  5. spring结合时,web.xml的配置

    <!-- 1. web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <pa ...

  6. Vue.js vui 饿了么Vue2.0的组件库

    http://www.oschina.net/news/78038/vue-js-2-0-3 http://git.oschina.net/durcframework/vui http://eleme ...

  7. 92. Reverse Linked List II

    题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1- ...

  8. MySQL数据库服务器安装标准

    MySQL数据库服务器安装标准 (1).BIOS优化,阵列配置 1.1:关闭CPU节能,因为服务器品牌众多,BIOS设置不相同,主要是关闭CPU节能,如C1,DELLR730,已经智能设置,直接有个p ...

  9. python web开发遇到socket.error[errno 10013]

    socket.error[errno 10013],端口被占用 重新换一个端口,或者把占用该端口的程序关闭就可以了

  10. SCOI2010 and SXOI2014 股票交易(DP)

    明显的单调队列…… 但下面的程序一直有bug 附上题解:http://blog.csdn.net/njlcazl/article/details/8611042 附上我的代码: var head,ta ...