【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 博士拿出 ...
随机推荐
- A glance on VDBI
Just like other thing in data transfter, a resource should have themselves description. And the reso ...
- ORA-00957: 反复的列名
1.错误描写叙述 ORA-00957: 反复的列名 2.错误原因 SQL> create table info( 2 stu_id varchar2(7) not null, 3 stu_nam ...
- caffe 在 windows 下的配置(scripts\build_win.cmd)
官网配置文档见:GitHub - BVLC/caffe at windows 1. windows 设置 requirements: visual studio 2013/2015 CMake > ...
- Hadoop3.0配置
1.core-site.xml <configuration> <property> <name>fs.default.namenode</name> ...
- Javascript和jquery事件--点击事件和触发超链接
前面的不过是一些基础的知识,真正的一些事件还是有点不同.还有一些命名空间的问题.不过现在ie也开始接受W3C标准,而且平时开发也很少考虑ie了,一些事件就不考虑ie了. 点击事件--click 大部分 ...
- 使用mingw制作dll文件
使用mingw制作dll文件 安装mingw 准备math.c文件 //math.c #include<stdio.h> int add(int a,int b){ return a+b; ...
- UML学习总结(1)——UML学习入门
随着亲手接触的项目越来越多,项目的复杂度越来越大,项目的理解程度也变的很难,尤其是在接收一个别人已经做好的项目时,你迫切先想到的就是"有没有文档啊",当然是各种文档,概要设计文档, ...
- Android实现主动连接蓝牙耳机
在Android程序中可以实现自动扫描蓝牙.配对蓝牙.建立数据通道. 蓝牙分不同类型,可以参考(http://gqdy365.iteye.com/admin/blogs/2229304) 可以入下面方 ...
- 源码笔记---MBProgressHUD
前言 作为初学者,想要快速提高自己的水平,阅读一些优秀的第三方源代码是一个非常好的途径.通过看别人的代码,可以学习不一样的编程思路,了解一些没有接触过的类和方法. MBProgressHUD是一个非常 ...
- POS 60域用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 自定义域(Reserved Private) 1.变量属性 N...17(LLLVAR),3个字节的长度值+最大17个字节的数字字符域. 压缩时用 ...