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 博士拿出了他最近发明的 ...
随机推荐
- LOJ P10116 清点人数 题解
每日一题 day13 打卡 Analysis 用简单的树状数组维护单点修改和查询就行了 #include<iostream> #include<cstdio> #include ...
- Oracle 10g和11g中的自动统计任务
1) 先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动 ...
- 二十六. 集群及LVS简介 LVS-NAT集群 LVS-DR集群
方案:安装ipvsadm软件包,关于ipvsadm的用法可以参考man ipvsadm资料. 常用ipvsadm命令语法格式如表-1及表-2所示. 1.ipvsadm命令用法(proxy) 1.1 创 ...
- Wireshark抓取本地回环接口数据包 RawCap.exe
Wireshark提供了winpcap可以抓取远程网卡数据包...但我尝试了不成功.后来发现RawCap.exe不仅可以抓取回环接口数据包,远程跑了拿到pcap文件再打开用起来比winpcap更方便最 ...
- syniverse是一家怎样的公司
syniverse是一家怎样的公司?(详见问题描述)? 李超 核心业务当然是国际漫游了.简单来说就是做全球各个运营商之间的hub. 打个比方说,一家运营商A做通信,它的覆盖范围肯定是有限的(比如中 ...
- Tkinter 之Place布局
一.参数说明 参数 作用 anchor 控制组件在 place 分配的空间中的位置"n", "ne", "e", "se&quo ...
- Nexus 3搭建及备份恢复
Nexus 3搭建 官网下载相应的软件版本:Nexus官网 配置仓库存放地址 # tar xf xxxx # more bin/nexus.vmoptions -Xms500M -Xmx500M -X ...
- 20175313 张黎仙《获奖感想与Java阶段性学习总结》
一.获奖感想 很荣幸能够成为为数不多的小黄衫获得者之一,这是对我近一学期以来学习成果的肯定,也激励着我更加努力学习. 首先我要感谢的人就是娄嘉鹏老师.我曾在师生关系中提到,我认为的好老师的特点之一是: ...
- Vue学习手记02 - 路由
1.项目 注意:项目在初始化的时候没有安装vue-router就需要进行安装 2.安装路由: 在项目中使用ctrl+`, 打开终端, 执行如下命令 npm i vue-router -S 或者 cn ...
- xgboost 源码学习
官方代码结构解析,README.MD XGboost 回归时,损失函数式平方误差损失 分类时,是对数自燃损失: Coding Guide ====== This file is intended to ...