NOIp 2009:靶形数独
题目描述 Description
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,
Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 格宽× 格高的大九宫格中有9 个3 格宽× 格
高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些 数字,利用逻辑推理,在其他的空格上填入1 到9 的数字。每个数字在每个小九宫格内不能
重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。 上图具体的分值分布是:最里面一格(黄色区域)为 分,黄色区域外面的一圈(红
色区域)每个格子为9 分,再外面一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕
色区域)每个格子为7 分,最外面一圈(白色区域)每个格子为6 分,如上图所示。比赛的
要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取
更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字
的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为2829。游
戏规定,将以总分数的高低决出胜负。 由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能
够得到的最高分数。 输入描述 Input Description
一共 行。每行9 个整数(每个数都在0— 的范围内),表示一个尚未填满的数独方
格,未填的空格用“”表示。每两个数字之间用一个空格隔开。 输出描述 Output Description
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-。 样例输入 Sample Input
【输入输出样例 】 【输入输出样例 】 样例输出 Sample Output
【输入输出样例 】 【输入输出样例 】 数据范围及提示 Data Size & Hint
【数据范围】
%的数据,数独中非0 数的个数不少于30。
%的数据,数独中非0 数的个数不少于26。
%的数据,数独中非0 数的个数不少于24。
题目

芒果君:爆搜里我认为很经典的题目,为了达到时限我也重构+调试了若干个小时,就说说自己的思路。
刚开始肯定都是正搜(左上到右下),没想到数据问题,倒搜快了好多,那我就想,能不能将9*9划分成四个象限(5*5),再判断搜索的起始点,不过比之前更慢了OTZ
之后看了一下题解,发现自己一直局限在某个角,而没有全局的看整个棋盘,接着就是不断地重构调试……
最后到极限……这是codevs上最慢的一个点了--> 测试点#sudoku20.in 结果:<label>AC</label> 内存使用量: 256kB 时间使用量: 222ms
O_o ->每个空格子的信息——横纵坐标和初始有哪些数可选,红字部分是剪枝的要点,预处理,之后我们的每次填数肯定都要看这个大的格局。贪心的,每次我们找到出度(可选的数)最小的格子去搜,但这个出度不能为0,如果为0就说明不能填了对不对w 如果为1呢,一定去填这个格子,直接跳出。
其实借鉴了别人的思想,但如果每次都在9*9*9范围内找显然有许多不必要的操作,我的优化就在于把寻找的范围缩小到每个空格和初始能填的数,用结构体存,比如(1,1)一开始能填的数是(1,2,3),那我只要看这3个数而不用再把一到九找一遍,然后还有毫无卵用的位运算,就缩了一点空间……还有更无卵用的register和inline什么鬼2333333
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define calg(x,y) ((x-1)/3)*3+(y-1)/3+1
using namespace std;
int cnt,ans=-,now,vis[],score[][][],mp[][],MP[][],r[],c[],g[],w[][]={{},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,}};
struct Ge{
int x,y,ccnt;
int list[];
}O_o[];
inline int read()
{
int ret=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){
ret=ret*+ch-'';
ch=getchar();
}
return ret;
}
bool cmp(Ge X,Ge Y)
{
if(X.ccnt!=Y.ccnt) return X.ccnt<Y.ccnt;
if(X.x!=Y.x) return X.x<Y.x;
return X.y<Y.y;
}
inline bool fill(register int x,register int y,register int val)
{
if(r[x]&(<<val)||c[y]&(<<val)||g[calg(x,y)]&(<<val)) return false;
r[x]|=<<val,c[y]|=<<val,g[calg(x,y)]|=<<val;
now+=score[x][y][val];
return true;
}
void dfs(register int f,register int sum)
{
if(sum>cnt){
ans=max(now,ans);
return;
}
vis[f]=;
register int x=O_o[f].x,y=O_o[f].y,flg=;
for(register int j=;j<=O_o[f].ccnt;++j){
register int i=O_o[f].list[j],minx=,zb=;
if(fill(x,y,i)){
flg=;
for(int k=;k<=cnt;++k){
if(vis[k]) continue;
int cd=O_o[k].ccnt,xx=O_o[k].x,yy=O_o[k].y;
for(int l=;l<=O_o[k].ccnt;++l){
int nnum=O_o[k].list[l];
if(r[xx]&(<<nnum)||c[yy]&(<<nnum)||g[calg(xx,yy)]&(<<nnum)) cd--;
}
if(!cd){
flg=;
break;
};
if(cd<minx){
minx=cd;
zb=k;
}
if(cd==) break;
}
if(flg) dfs(zb,sum+);
r[x]^=<<i,c[y]^=<<i,g[calg(x,y)]^=<<i;
now-=score[x][y][i];
}
}
vis[f]=;
}
int main()
{
//freopen("sudoku.in","r",stdin);
//freopen("sudoku.out","w",stdout);
for(int i=;i<=;++i)
for(int j=;j<=;++j)
for(int k=;k<=;++k)
score[i][j][k]=w[i][j]*k;
for(int i=;i>;--i)
for(int j=;j>;--j){
mp[i][j]=read();
fill(i,j,mp[i][j]);
}
for(int i=;i<=;++i)
for(int j=;j<=;++j){
if(mp[i][j]) continue;
O_o[++cnt].x=i;
O_o[cnt].y=j;
for(int k=;k<=;++k){
if(r[i]&(<<k)||c[j]&(<<k)||g[calg(i,j)]&(<<k)) continue;
else O_o[cnt].list[++O_o[cnt].ccnt]=k;
}
}
sort(O_o+,O_o+cnt+,cmp);
dfs(,);
printf("%d",ans);
return ;
}
NOIp 2009:靶形数独的更多相关文章
- NOIP 2009 靶形数独(DLX)
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作 ...
- [NOIp 2009]靶形数独
Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...
- [COGS 0407][NOIP 2009] 靶形数独
407. [NOIP2009] 靶形数独 ★★ 输入文件:sudoku.in 输出文件:sudoku.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华 ...
- 靶形数独 2009年NOIP全国联赛提高组(搜索)
靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小城和小华都是热爱数 ...
- 【NOIP 2009】靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- 靶形数独(codevs 1174)
1174 靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
随机推荐
- ckeditor粘贴word
); Server.setTimeout(_this.config.timeout, function(cli){ cli.end('timeout\n'); }); console.log('Ser ...
- leetcode解题报告(23):Pascal's Triangle
描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, R ...
- 模拟I2C协议学习点滴之程序相关定义
由于主机和从机都会给数据线SDA发信号,比如主机先给SDA发送数据后,从机收到数据后发送应答信号将SDA拉低,故SDA类型设定为inout.而DATA设定为inout类型,是起到校验通信的作用(后续的 ...
- Ubuntu输入ifconfig找不到IP地址,只有lo问题
首先我的问题是这样的 然后一顿神百度,要找到你之前用的网卡或者设备,ifconfig -a,然后好用,出来了 但是并没有IP地址什么的,网上给的重启命令也没有用 输入的命令是:ifconfig ens ...
- filter方法求出列表所有奇数并构造新列
a = [, , , , , , , , , ] b = filter(lambda x: x % != , a) for i in b: print(i)
- luogu P4168 蒲公英+ 分块学习笔记
传送门 题目描述 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列\((a_1,a_2..a_n)\),其中 \(a_i\)为一 ...
- Windows下OpenFOAM开发及使用环境配置指南 (1)【转载】
转载自:http://openfoam.blog.sohu.com/158614863.html *************************************************** ...
- web目录
Proj app controllers jobs models view user xxx.html init.go conf message public img js css html
- Webpack中的sourcemap以及如何在生产和开发环境中合理的设置
一 . 从Sourcemap和Data URL说起 (1)什么是Sourcemap? 我们在打包中,将开发环境中源代码经过压缩,去空格,babel编译转化,最终可以得到适用于生产环境的项目代码,这样处 ...
- 调用百度地图API的总结
因为项目要用到百度地图,所以先摸索了一下,各种功能官方都有文档,点击可查看,文章的话我就直接写我用到的功能例子了,要用可以直接复制粘贴~ 一.主要涉及到的几个接口(先申请密钥): 1.技术一:坐标转换 ...