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

【样例输入1】
7 0 0 9 0 0 0 0 1
1 0 0 0 0 5 9 0 0
0 0 0 2 0 0 0 8 0
0 0 5 0 2 0 0 0 3
0 0 0 0 0 0 6 4 8
4 1 3 0 0 0 0 0 0
0 0 7 0 0 2 0 9 0
2 0 1 0 6 0 8 0 4
0 8 0 5 0 4 0 1 2
【样例输出1】
2829
【样例输入2】
2852
【解题思路】
本题为NOIP2009提高组第四题,时间给的很充裕,4s的时间深搜绰绰有余(真不知道为什么题解中说要卡评测机……),只需稍作优化即可,然后注意一下数独的规则,注意如何判重。
下面来说说优化。
首先记录下0的个数和位置,然后只需要对每个0的位置从1搜索到9即可,题目中说非0的个数不少于24,这样下来时间复杂度就减少了O((24*9)^n),然后……似乎就没有然后了。
【代码实现】
type rec=record
x,y:longint;
end;
const fs:array[..,..] of longint=((,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,));
num:array[..,..] of longint=((,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,),
(,,,,,,,,));
var c:array[..,..] of longint;
i,j,ans,n,w,max:longint;
a:array[..] of rec;
f1,f2,f3:array[..,..] of boolean;
procedure dfs(n:longint);
var i,j,k:longint;
begin
if n= then
begin
if ans>max then
max:=ans;
exit;
end;
i:=a[n].x;
j:=a[n].y;
for k:= to do
if (f1[i,k])and(f2[j,k])and(f3[num[i,j],k]) then
begin
f1[i,k]:=false;
f2[j,k]:=false;
f3[num[i,j],k]:=false;
c[i,j]:=k;
ans:=ans+k*fs[i,j];
dfs(n-);
ans:=ans-k*fs[i,j];
f1[i,k]:=true;
f2[j,k]:=true;
f3[num[i,j],k]:=true;
end;
end;
begin
fillchar(f1,sizeof(f1),true);
fillchar(f2,sizeof(f2),true);
fillchar(f3,sizeof(f3),true);
for i:= to do
for j:= to do
begin
read(c[i,j]);
if c[i,j]= then
begin
inc(n);
a[n].x:=i;
a[n].y:=j;
end
else
begin
f1[i,c[i,j]]:=false;
f2[j,c[i,j]]:=false;
f3[num[i,j],c[i,j]]:=false;
ans:=ans+c[i,j]*fs[i,j];
end;
end;
dfs(n);
for i:= to do
for j:= to do
if c[i,j]= then
begin
writeln(-);
halt;
end;
writeln(max);
end.
靶形数独 (codevs 1174)题解的更多相关文章
- 靶形数独(codevs 1174)
1174 靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- CODEVS 1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地 迷上了数独游戏,好胜的他们想用数独来一比高低.但普通 的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z ...
- 【CodeVS】p1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...
- P1074 靶形数独题解
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- [NOIP2009]靶形数独 题解
407. [NOIP2009] 靶形数独 时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...
- NOIp 2009:靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教, Z ...
- Vijos1775 CodeVS1174 NOIP2009 靶形数独
靶形数独 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发 ...
- 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独
题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...
- [NOIp 2009]靶形数独
Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...
随机推荐
- hive 调用java的函数和科学记数法转换
hive中field如果是string,比如id,那么使用10000000000+id结果是科学计数法显示,转换为正常显示方法: select (10000000000+cast(id as int) ...
- BeanDefinitionStoreException: Failed to read candidate component class: URL
如题,遇到这种情况一般都是引用jar包版本不一致或者编译后的class除了问题 解决办法: a.如果是maven项目,把项目全部clean一下,重新mvn install b.如果不是maven项目, ...
- python3 内置函数 filter()
filter(function or None, iterable) --> filter object Return an iterator yielding those items of i ...
- js的传值,table中tr的遍历,js中动态创建数组
1.这里关键是对页面中的传值,其次是动态的创建一个数组,用来存值 $(val).css("background-color", "rgb(251, 248, 233)&q ...
- JavaScript对象的创建之构造函数
通过构造函数的方式创建和基于工厂的创建类似,最大的区别就是函数的名称就是类的名称,按照java的约定,第一个字母大写. 使用构造函数创建对象时,在函数内部是通过this关键字来完成属性的定义. fun ...
- 用github pages展示你的静态网页,多项目支持
我看到有分享用github pages来做博客的,不过我并不想挂博客在上面,我只是想将我的一些作品挂上去,然后链接到我的简历里,这样HR可以直接看到. 首先是最基本的操作,在github上创建一个新的 ...
- 【LeetCode】84. Largest Rectangle in Histogram
Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...
- powerdesigner中怎么给一主键设为自增型auto increme
在使用powerdesigner 设计数据库表时,通常要对主键进行设置,如果主键是int 类型,一般会设置成自增,那么怎么在 powerdesigner 中设置呢,以下是具体的方法: 在所要设为自增型 ...
- 跟我学 NHibernate (三)
在使用 NHibernate 时,一定要将Mapping 映射文件,也就是 xml 文件的编译方式设置成 嵌入式,这是因为在 NHibernate 启动时,它会主动的到项目的启动目录中寻找 被设置为嵌 ...
- 简单jQuery实现选项框中列表项的选择
这段代码非常的简单,仅仅作为自己的一个小小的记录! ok,先上一个简单的图例,效果如下(注意:这只是一个简单的例子,不过可以根据这个简单的例子,变化出更为复杂的效果)! 代码也非常的简单,如下所示(注 ...