【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 博士拿出 ...
随机推荐
- UML类图与类图中的关系
以下内容摘自<Java与模式> 在类与类之间,会有连线指明它们之间的关系.类和类.类和接口.接口和接口之间可以建立以下几种关系:一般化关系.关联关系.聚合关系.合成关系和依赖关系,这几种关 ...
- Eclipse中Git插件使用技巧:[5]还原文件
如果修改了某个文件并未提交至本地库(add index),那么怎么还原呢?Git插件中并不像Svn插件直接提供有还原方式.其实无论是否提交至本地库或者远程库,还原操作的本质都是将文件的当前版本还原至之 ...
- 韦东山网课https://edu.csdn.net/course/play/207/1117
接口讲解https://edu.csdn.net/course/play/207/1117
- 【Codeforces Round #447 (Div. 2) C】Marco and GCD Sequence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把gcd(a[1..n])放在输入的n个数之间. [代码] /* 1.Shoud it use long long ? 2.Have ...
- [RxJS] Avoid mulit post requests by using shareReplay()
With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...
- Photon + Unity3D 线上游戏开发 学习笔记(三)
好的,说了两篇了 如今我们正式的入手,揭开photon 的盖头哈 建立photon项目 第一步: 在Visual studio建立一个空的 待会为了測试也会在里面建立一个client 项目 (只 ...
- Costura.Fody
使用Costura.Fody将源DLL合并到目标EXE 本文为原创文章,如转载,请在网页明显位置标明原文名称.作者及网址,谢谢! 一.本文主要是使用Costura.Fody工具将源DLL合并到目标EX ...
- (转)使用qemu-img管理虚拟机磁盘镜像(创建虚拟机,虚拟机快照)
转自:http://blog.csdn.net/bravezhe/article/details/8461386 一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系 ...
- 16进制串与ASCII字符串相互转换
提供两个函数,方便十六进制串与ASCII 字符串之间的相互转换,使用函数需要注意的是返回的串是在堆上通过 calloc 分配的,所以,记得使用完返回值释放该块,并且将指向该块的指针 =NULL .// ...
- 老李的菜园 mysql 自定义函数
新建: Create function function_name(参数列表)returns返回值类型 函数体 函数名,应该合法的标识符,并且不应该与已有的关键字冲突. 一个函数应该属于某个数据库,可 ...