【b094&&z14】靶形数独
【问题描述】
小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的分们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向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】
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
【输入样例1】
0 0 0 0 0 2 4 5 3
9 0 0 0 0 8 0 0 0
7 4 0 0 0 5 0 1 0
7 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
【输出样例1】
2852
【数据范围】
对于40%的数据,数独中非0数的个数不少于30
对于80%的数据,数独中非0数的个数不少于26
对于100%的数据,数独中非0数的个数不少于24
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=b094
【题解】
一道搜索题;
有点像n皇后吧.
你要处理出所有的空白点能够放置的数字有哪些;
1.要和这个点所在的小方块里面的数字不同
2.要和这个点所在的行的数字不同
3.要和这个点所在的列的数字不同
小方块的话
点(x,y)对应了第(x-1)/3+1行、第(y-1)/3+1列的方块;
然后枚举一行一行地枚举各个空白块要用哪些数字就好;
但是这样还不够.
还得把每行的空白块数目处理出来;
然偶把行数的空白块从小到大排序;
优先搜索空白块数目较少的行.
这样速度比较快。
空白块的数目越少;
前面的搜索层,所需要的枚举量就越少.
这样可以比较快地知道这个状态是否有没有解;
(如果没有解的话只要搜索较少的层就能知道了,可以及时地退出.就这样想吧。别琢磨了)
【完整代码】
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define rep1(i,x,y) for (int i = x;i <= y;i++)
using namespace std;
const int MAXN = 10;
struct abc
{
int rest,id;
};
int a[MAXN][MAXN],point[MAXN][MAXN],ans = -1;
bool heng[MAXN][MAXN],shu[MAXN][MAXN],fk[4][4][MAXN];
abc b[MAXN];
bool cmp(abc a,abc b)
{
return a.rest<b.rest;
}
void QAQ()
{
puts("-1");
exit(0);
}
void o_o()
{
int sum = 0;
rep1(i,1,9)
rep1(j,1,9)
sum+=a[i][j]*point[i][j];
if (sum>ans)
ans = sum;
}
void dfs(int x,int y)
{
if (x==10)
{
o_o();
return;
}
if (y>9)
{
dfs(x+1,1);
return;
}
if (a[b[x].id][y]>0)
{
dfs(x,y+1);
return;
}
int tx = (b[x].id-1)/3+1,ty = (y-1)/3+1;
for (int i = 1;i <= 9;i++)
if (!heng[b[x].id][i] && !shu[y][i] && !fk[tx][ty][i])
{
heng[b[x].id][i] = shu[y][i] = fk[tx][ty][i] = true;
a[b[x].id][y] = i;
dfs(x,y+1);
a[b[x].id][y] = 0;
heng[b[x].id][i] = shu[y][i] = fk[tx][ty][i] = false;
}
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
int quan = 0,p = 6;
while (quan<=4)
{
int x = 1 + quan,y = 1 + quan;
point[x][y] = p;
while (y+1<=9-quan){y++;point[x][y] = p;}
while (x+1<=9-quan){x++;point[x][y] = p;}
while (y-1>=1+quan){y--;point[x][y] = p;}
while (x-1>=1+quan){x--;point[x][y] = p;}
p++;
quan++;
}
rep1(i,1,9)
{
b[i].id = i;
rep1(j,1,9)
{
scanf("%d",&a[i][j]);
if (a[i][j]>0)
{
if (heng[i][a[i][j]] || shu[j][a[i][j]])
QAQ();
if (fk[(i-1)/3+1][(j-1)/3+1][a[i][j]])
QAQ();
heng[i][a[i][j]]=shu[j][a[i][j]]=true;
fk[(i-1)/3+1][(j-1)/3+1][a[i][j]]=true;
}
else
b[i].rest++;
}
}
sort(b+1,b+1+9,cmp);
dfs(1,1);
printf("%d\n",ans);
return 0;
}
【b094&&z14】靶形数独的更多相关文章
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- 靶形数独(codevs 1174)
1174 靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 【CodeVS】p1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 靶形数独 (codevs 1174)题解
[问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“ ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- Luogu1074靶形数独【启发式搜索】
Luogu1074靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, ...
- 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独
题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...
随机推荐
- Java Web学习总结(1)——JavaWeb开发入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- View源码分析如何创建
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/jj120522 博主导读:View是Android中最重要的控件,几乎所有的控件都与View相 ...
- textview-显示行数限制
在代码中直接添加 android:maxLines="2" android:ellipsize="end" 跟ellipsize搭配使用,超过两行的时候,第二行 ...
- HTML中input标签maxlength属性的妙处
HTML中的input标签可是很常用的. HTML本身也非常简单,就是若干标签,每个标签有若干属性. 我在学习HTML的过程中,也没有太过重视. 今年,在写前端表单验证的时候,发现maxlength这 ...
- MyCat:对MySQL数据库进行分库分表
本篇前提: mycat配置正确,且能正常启动. 1.schema.xml <table>标签: dataNode -- 分片节点指定(取值:dataNode中的name属性值) rule ...
- 彩票案例-frame,center和bounds属性
控件的属性: 二.frame.center和bounds属性 " 在iOS中,每一个控件都是继承于UIView的.都会有视图的属性存在,控制这个视图的位置就有Frame和Bounds两个属性 ...
- Redo 非current损坏
Redo log 文件损坏或丢失,在启动数据库时在alert日志中会有如下错误: ORA-00313: open failed for members of log group 1 of thread ...
- Loadrunner--常见问题及解决办法
1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消掉 2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen.exe文件 遇到flight界面为空的 ...
- amazeui页面分析4
amazeui页面分析4 一.总结 1.直接照着作者的设计思路用:例如 pet_hd_con_time pet_hd_con_map ,这是time 和 map,那我别的说不定也可以直接用,比如aut ...
- 函数的引用透明性(referential transparency)
1. 基础 初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数. 在数学函数中 y=f(x),一个输入值有固定的输出值.例如,无论计算多少次,sinπ 的 ...