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 博士拿出了他最近发明的 ...
随机推荐
- 遇到一张jpg的图片打不开,ps打不开,fireworks,打不开,ie8浏览器上显示不了,其他的浏览器没问题
1.在photoshop上报错; 2.在fireworks上报错 3.ie8上 其他的图片都可以,就这张不可以,没发现什么不同的地方,都是jpg格式的呀,而且谷歌浏览器能显示出来; 处理方法: 1.选 ...
- [NOI2010]超级钢琴 倍增
[NOI2010]超级钢琴 倍增 题面 暴力:枚举区间丢入堆\(O(n^2logn)\) 正解:考虑每次枚举和弦起点\(s\),那么以\(s\)为起点的和弦为\(sum[t]-sum[s](s+L-1 ...
- Ansible管理上千台主机时需要的速度优化
1 开启ssh长连接 OpenSSH 5.6版本后SSH支持了Multiplexing 设置参数 ssh_args = -C -o ControlMaster=auto -o ControlPersi ...
- matplot 绘制折线图
#coding=utf-8 import matplotlib.pyplot as pltx_data = ['2011','2012','2013','2014','2015','2016','20 ...
- Jenkins 更新 jenkins.war的方法
Jenkins 有时候更新,直接是主页提示下载 jenkins.war只需要把下载的jenkins.war 替换原来的jenkins.war 就可以了那么问题来了? 原来的 jenkins.war 到 ...
- GitHub发卡系统zfaka配置历程
GitHub发卡系统zfaka配置历程 1项目介绍 ZFAKA发卡系统(本系统基于yaf+layui开发) 项目地址 https://github.com/zlkbdotnet/zfaka 我 ...
- WORD转HTML-python第三方包Mammoth(官方文档翻译)
Mammoth 官方 Mammoth可用于将.docx文档(比如由Microsoft Word创建的)转换为HTML.Mammoth致力于通过文档中的语义信息生成简洁的HTML,而忽略一些其他细节.例 ...
- resin初识
Resin初识 1. resin简介 刚入职的公司用的后台服务器是resin,故因此学习记录一下. resin是一个非常流行的web引用服务器,对servlet和jsp提供了良好的支持,自身采用jav ...
- Linux 使用 you-get 指令下载网页视频
今天无意中发现一个下载网页视频的好办法 在 Linux 系统中,可以利用 you-get 指令直接下载网页中的视频 1.更新 sudo apt-get update 2.安装 pip sudo apt ...
- php手记之03-tp5渲染视图
// 渲染视图 模块@文件/文件名 // return view('index@index/test'); // return view('index@test/test'); // return $ ...