【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 博士拿出 ...
随机推荐
- PatentTips - Interrupt redirection for virtual partitioning
BACKGROUND The present disclosure relates to the handling of interrupts in a environment that utiliz ...
- actionbar spinner-用法实例
今天需要更改一个actionbar上的spinner的字体颜色,结果试了好长时间都没有解决,最后才发现,原来他是在代码下增加的一个textview,然后使用adapter加载的,并不是直接用frame ...
- 1.7 Python基础知识 - 模块初识
在Python中有很多模块,模块对应的就是python源代码文件.模块中有Python程序自己附带的标准模块,还有很多其他人共享的第三方模块.模块中可以定义变量.函数和类.而多个功能类似的模块可以组织 ...
- table嵌套table,jquery获取tr个数
一.所有tr的个数 $("#tableId tr").length 二.所有一级tr的个数 1.$("#tableId > tr").length 2.$ ...
- ASP.Net中页面传值的几种方式
开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...
- 韦东山网课https://edu.csdn.net/course/play/207/1117
接口讲解https://edu.csdn.net/course/play/207/1117
- Flask项目之手机端租房网站的实战开发(六)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- [python]两种编程思维--面向过程和面向对象
例如:eg:炒一份西红柿鸡蛋 一.面向过程 面向过程的编程思维,如下 二.面向对象 制作一台炒菜机器人,然后告诉机器人做一道西红柿炒鸡蛋.在这里,我们直接面对的是机器人,而非炒菜的过程,所以这里机器人 ...
- 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...
- POJ3984 迷宫问题 BFS
看题传送门:http://poj.org/problem?id=3984 BFS水一发 明天帮学弟挑电脑顺便去玩.接下来几天好好看数据结构.嗯哼. 这题标准的BFS应用,唯一需要注意的是需要输出中间的 ...