//人生中第一道蓝题(3.5h)

题目描述

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

靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个 3 格宽3×3 格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)

上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色区域)每个格子为9分,再外面一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕色区域)每个格子为7分,最外面一圈(白色区域)每个格子为6分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和

总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。

由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。

输入输出格式

输入格式:

一共 9 行。每行9个整数(每个数都在 0−9 的范围内),表示一个尚未填满的数独方格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。

输出格式:

输出共 1 行。输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。

输入输出样例

输入样例#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:

0 0 0 7 0 2 4 5 3
9 0 0 0 0 8 0 0 0
7 4 0 0 0 5 0 1 0
1 9 5 0 8 0 0 0 0
0 7 0 0 0 0 0 2 5
0 3 0 5 7 9 1 0 8
0 0 0 6 0 1 0 0 0
0 6 0 9 0 0 0 0 1
0 0 0 0 0 0 0 0 6
输出样例#2:

2852

说明

【数据范围】

40%的数据,数独中非 00 数的个数不少于3030。

80%的数据,数独中非 00 数的个数不少于2626。

100%的数据,数独中非00数的个数不少于2424。

NOIP 2009 提高组 第四题

解题思路:

搜索,用一个数组s保存要存的点,其中s[ i ][0]与s[ i ][1]存点的坐标,s[ i ][2]存点在什么颜色上,s[ i ][3]存点的所在宫,用三个布尔数组分别记录当前行、列、宫中已经放了哪些数,如果这样搜会TLE,所以我们要剪枝,因为dfs层数与0的个数有关,层数太多就TLE了,我们知道,一行中填过的数字越多,需要填的数越少,就意味着dfs层数越少!所以,我们先填0的数量少的行。

AC代码:

 #include<cstdio>
#include<algorithm>
using namespace std;
struct kkk {
int rank,sum = ;//rank表示行号,sum表示这行0的个数
}e[];
int a[][],s[][],bj = ,ans,daan = -;//bj记录0的个数,daan为最终答案
bool h[][],l[][],g[][];//h,l,g分别表示行列宫的放置情况
int find(int i,int j) {//找当前点在哪个宫
if(i <= ) {
if(j <= ) return ;
else if(j <= ) return ;
else return ;
}
else if(i <= ) {
if(j <= ) return ;
else if(j <= ) return ;
else return ;
}
else {
if(j <= ) return ;
else if(j <= ) return ;
else return ;
}
}
int score(int i,int j) {//判断当前点在哪个颜色上
if(i == || j == || i == || j == ) return ;
if(i == || j == || i == || j == ) return ;
if(i == || j == || i == || j == ) return ;
if(i == || j == || i == || j == ) return ;
return ;
}
bool cmp(kkk d,kkk b) {//根据每行0的个数排序
return d.sum < b.sum;
}
void dfs(int b,int k) {//表示在搜s[b],当前分数为k
if(b == bj) {//合法填完了所有数
if(k > daan) daan = k;//更新答案
return ;
}
for(int i = ;i <= ; i++) {
if(!h[s[b][]][i] && !l[s[b][]][i] && !g[s[b][]][i]) {//如果当前行,列,宫没有放过这个数
h[s[b][]][i] = l[s[b][]][i] = g[s[b][]][i] = ;//标记
dfs(b + ,k + (s[b][] * i));//搜索
h[s[b][]][i] = l[s[b][]][i] = g[s[b][]][i] = ;//回溯
}
}
return ;
}
int main()
{
for(int i = ;i <= ; i++) e[i].rank = i;//初始化行号
for(int i = ;i <= ; i++)
for(int j = ;j <= ; j++) {
scanf("%d",&a[i][j]);
if(a[i][j] > ){//如果这个数不是0
h[i][a[i][j]] = l[j][a[i][j]] = g[find(i,j)][a[i][j]] = ;//标记当前行,列,宫已经放置了这个数,以后就不能放这个数了
ans += a[i][j] * score(i,j);//ans记录初始化地图已知数字总分和
}
else e[i].sum++;//否则这行0个数加一
}
sort(e+,e+,cmp);
for(int i = ;i <= ; i++)
for(int j = ;j <= ; j++)//从0的个数少的行开始
if(a[e[i].rank][j] == )
s[bj][] = e[i].rank,s[bj][] = j,s[bj][] = score(e[i].rank,j),s[bj++][] = find(e[i].rank,j); //记录图中0的信息
dfs(,ans);
printf("%d",daan);
return ;
}

//NOIP提高 2009 T4

洛谷 P1074 靶形数独(剪枝)的更多相关文章

  1. 洛谷——P1074 靶形数独

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

  2. 洛谷P1074 靶形数独 [搜索]

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

  3. [洛谷P1074] 靶形数独

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

  4. [NOIP2009] 提高组 洛谷P1074 靶形数独

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

  5. 洛谷 P1074 靶形数独 Label:search 不会

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

  6. 洛谷 P1074 靶形数独

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

  7. 洛谷—— P1074 靶形数独

    https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...

  8. 洛谷P1074 靶形数独【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...

  9. 洛谷P1074 靶形数独(算竞进阶习题)

    还是数独.. 比上一个多了个分数矩阵,其实没什么差别,但是数据好像水了许多... #include <bits/stdc++.h> #define INF 0x3f3f3f3f using ...

随机推荐

  1. 解决Codeforces访问慢的本地方案

    参考: http://m.blog.csdn.net/blog/Xiangamp/42245923#

  2. KSQL日期字段访问

    日期常量用法 KSQL中用日期常量必须用{ts'" + dateTime.ToString("yyyy-M-d HH:mm:ss") + "'} 正确写法: I ...

  3. 剑客决斗(NYOJ 110)

    T3.题目110剑客决斗 (http://acm.nyist.net/JudgeOnline/problem.php?pid=110) 描述 在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗.n个 ...

  4. Linux下汇编语言学习笔记53 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  5. Organize Your Train part II 字典树(此题专卡STL)

    Organize Your Train part II Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8787   Acce ...

  6. Remove Duplicates from Sorted Array(参考)

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  7. Vuzzer自动漏洞挖掘工具简单分析附使用介绍

    Vuzzer 是由计算机科学机构  Vrije Universiteit Amsterdam.Amsterdam Department of Informatics 以及 International ...

  8. 百度编辑器ueditor给上传的图片加入水印

    百度编辑器本身是没有为上传图片加入水印的功能,想要在上传的时候加入图片水印,也非常easy.以 ueditor 1.2.6 为例.打开php文件夹以下的imageUp.php文件,查找"$i ...

  9. FFmpeg的HEVC解码器源码简单分析:概述

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  10. Lighttpd 插件mod_h264 streaming (mp4)安装

    1. 对于安装lighttpd须要支持mp4伪流媒体格式,建议不要到官方下载lighttpd安装文件,到 插件H264 Streaming Module官网,下载已经整合了的安装包 http://h2 ...