【问题描述】

小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向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)题解的更多相关文章

  1. 靶形数独(codevs 1174)

    1174 靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  2. CODEVS 1174 靶形数独

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

  3. 【CodeVS】p1174 靶形数独

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

  4. P1074 靶形数独题解

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

  5. [NOIP2009]靶形数独 题解

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

  6. NOIp 2009:靶形数独

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

  7. Vijos1775 CodeVS1174 NOIP2009 靶形数独

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

  8. 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独

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

  9. [NOIp 2009]靶形数独

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

随机推荐

  1. ORA-04031 With Leak in "OBJ STAT MEMO" Allocations Seen in V$SGASTAT on 10.2.0.5 (文档 ID 1350050.1)

    APPLIES TO: Oracle Server - Enterprise Edition - Version: 10.2.0.5<max_ver> and later   [Relea ...

  2. HDU 4334 Trouble

    Trouble Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. 双系统下恢复Ubuntu引导菜单

    引言 使用双系统的时候,我们经常重装Windows!那么有没有一种办法:只重装Windows而不重装Ubuntu呢? 在使用Win XP/Ubuntu双系统时,这个问题很好解决!但是在使用Win7(包 ...

  4. 关联规则挖掘之apriori算法

    前言: 众所周知,关联规则挖掘是数据挖掘中重要的一部分,如著名的啤酒和尿布的问题.今天要学习的是经典的关联规则挖掘算法--Apriori算法 一.算法的基本原理 由k项频繁集去导出k+1项频繁集. 二 ...

  5. JavaScript == VS ===

    引用自  http://fxk2006.iteye.com/blog/768260 ==   equality 等同,两边值类型不同的时候,要先进行类型转换,再比较. === identity 恒等, ...

  6. Adobe AIR and Flex - 实现堆栈容器

    1.需求描述: 在对云平台的监控中,我们经常需要在一张图上可视化的描述集群下的物理机所虚拟的虚拟机使用情况,以及超卖情况.那么传统的chart图就不满足我们的需求了,那么要实现这样一个定制化的char ...

  7. 缓存之Memcached

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  8. IList,IQeurable,IEnumble和List 的区别

    IList,IQeurable,IEnumble和List 的区别主要如下: 1.IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred exe ...

  9. nginx 完全关闭 access_log

    修改nginx.config access_log off;

  10. MongoDB 3: 使用中的问题,及其应用场景

    导读:用MongoDB去存储非关系型的数据,是一个比较正确的选择.但是,如果只是用MongoDB,那么也会出现一些问题.MongoDB,尤其使用的最佳场景,更多的时候,需要结合关系型数据库共同解决问题 ...