[COGS 0407][NOIP 2009] 靶形数独
407. [NOIP2009] 靶形数独
★★ 输入文件:
sudoku.in输出文件:sudoku.out简单对比
时间限制:5 s 内存限制:128 MB【问题描述】
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的) 。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1到 9 的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。 (如图)
上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8分,蓝色区域外面一圈(棕色区域)每个格子为 7分,最外面一圈(白色区域)每个格子为 6 分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法) ,而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。
由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。【输入】
输入文件名为 sudoku.in。
一共 9 行。每行 9 个整数(每个数都在 0—9 的范围内) ,表示一个尚未填满的数独方格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。【输出】
输出文件 sudoku.out共 1行。
输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。【输入输出样例 1】
sudoku.in
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 2sudoku.out
2829
【输入输出样例 2】
sudoku.in
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 6sudoku.out
2852
【数据范围】
40%的数据,数独中非 0数的个数不少于 30。
80%的数据,数独中非 0数的个数不少于 26。
100%的数据,数独中非 0 数的个数不少于 24。
这题乍一看让人感觉一脸不可做的样子
表示我的内心一脸懵逼甚至还想学 $DLX$
结果实际上打了个最为暴力的暴搜就过了...
大概搜索思路: 开三个数组保存九宫格/行/列中是否出现过某数, 然后开两个用来记录某下标的得分权值与所属九宫格编号.
然后 $DFS$ 搜索枚举每个未知位置的可能值, 枚举时根据三个数组判一下是否在该行/列/九宫格内出现过. 发现可行解后更新答案.
然后就AC了=_=...一脸懵逼.png
参考代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
typedef std::pair<int,int> Point; const int MAXN=; const int score[MAXN][MAXN]={{},
{,,,,, ,,,,},
{,,,,, ,,,,},
{,,,,, ,,,,},
{,,,,, ,,,,},
{,,,,,,,,,},
{,,,,, ,,,,},
{,,,,, ,,,,},
{,,,,, ,,,,},
{,,,,, ,,,,}};
const int block[MAXN][MAXN]={{},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}}; int ans=-;
int known;
int unknown;
Point u[MAXN*MAXN];
bool col[MAXN][MAXN];
bool row[MAXN][MAXN];
bool visited[MAXN][MAXN]; void Initialize();
void DFS(int,int); int main(){
Initialize();
DFS(unknown,known);
printf("%d\n",ans);
return ;
} void DFS(int rest,int sum){
if(rest==){
ans=std::max(ans,sum);
return;
}
else{
for(int i=;i<=;i++){
if(!visited[block[u[rest].first][u[rest].second]][i]&&!row[u[rest].first][i]&&!col[u[rest].second][i]){
row[u[rest].first][i]=true;
col[u[rest].second][i]=true;
visited[block[u[rest].first][u[rest].second]][i]=true;
DFS(rest-,sum+score[u[rest].first][u[rest].second]*i);
visited[block[u[rest].first][u[rest].second]][i]=false;
col[u[rest].second][i]=false;
row[u[rest].first][i]=false;
}
}
}
} void Initialize(){
#ifndef ASC_LOCAL
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
#endif
int tmp;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
scanf("%d",&tmp);
if(tmp==){
unknown++;
u[unknown].first=i;
u[unknown].second=j;
}
else{
known+=tmp*score[i][j];
visited[block[i][j]][tmp]=true;
row[i][tmp]=true;
col[j][tmp]=true;
}
}
}
}
Backup
日常图包w
[COGS 0407][NOIP 2009] 靶形数独的更多相关文章
- NOIP 2009 靶形数独(DLX)
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作 ...
- [NOIp 2009]靶形数独
Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...
- 靶形数独 2009年NOIP全国联赛提高组(搜索)
靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小城和小华都是热爱数 ...
- 【NOIP 2009】靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- NOIp 2009:靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向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 博士拿出了他最近发明的 ...
随机推荐
- Ibatis SqlMap映射关系总结
一.一对一关系一对一关系即一对单个对象,下面举例说明:一对单个对象例如:<resultMap id="loadAResult" class="A"> ...
- 学习Rails之activeAdmin
一.开始ActiveAdmin Active Admin是一个发布在RAILS3中使用的Gem. 1.我们为了快速开始我们对Active Admin的了解,我们首先安装它: 在你GemFile ...
- Swift函数_默认参数
swift中提供了默认参数功能,在声明函数时给参数指定默认值. 例: func inputStudentInfo(name:String,age:Int="26") { print ...
- JS 浮点数计算
一.从String中解析浮点数 parseFloat(string) 语法说明 parseFloat是个全局函数,不属于任何对象. parseFloat将它的字符串参数解析成为浮点数并返回.如果在解析 ...
- 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
转自:https://blog.csdn.net/eson_15/article/details/51425010 上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登 ...
- process对象
一.目录 process对象是Node的一个全局对象,提供当前Node进程的信息.它可以在脚本的任意位置使用,不必通过require命令加载.该对象部署了EventEmitter接口. 二.属性 pr ...
- safari
http://www.zhangxinxu.com/wordpress/2014/10/mobilebone-js-mobile-web-app-core/ http://rawgit.com/zha ...
- 使用css实现三角符号
关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理 下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处 ...
- drupal的权限设置
通过hook_menu()设置url的权限,有两种方式: 方式一:定义函数,通过 access callback 'access callback' => 'fun()', function f ...
- HTML表单相关
表单:<input type="text" name="" value="" size="显示字符数" maxle ...

