【问题描述】

小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的分们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向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】靶形数独的更多相关文章

  1. NOIP2009靶形数独[DFS 优化]

    描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...

  2. 靶形数独(codevs 1174)

    1174 靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  3. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  4. 【CodeVS】p1174 靶形数独

    题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...

  5. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  6. 靶形数独 (codevs 1174)题解

    [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“ ...

  7. NOIP2009 靶形数独

    4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...

  8. Luogu1074靶形数独【启发式搜索】

    Luogu1074靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, ...

  9. 【NOIP2009】【CJOJ1687】【洛谷1074】靶形数独

    题面 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出 ...

随机推荐

  1. 异步调用WCF的方法需要小心的地方

    直接使用下面的代码,由于client对象占用的资源没有被释放,会导致内存泄露GetSimServiceReference.GetSimServiceClient client = new GetSim ...

  2. Eclipse工具修理集

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 俗话说:工欲善其事.必先利其器,eclipse偶尔会发发脾气,那我们要记录下"她" ...

  3. 单元测试Assert类

    Assert类主要的静态成员 1. AreEqual:方法被重载了N多次,主要功能是判断两个值是否相等:如果两个值不相等,则测试失败. 2. AreNotEqual:方法被重载了N多次,主要功能是判断 ...

  4. CentOS搭建xfce桌面+VNC教程

    CentOS搭建xfce桌面+VNC教程 Linux的安全与性能向来为开发者所称道,你可以轻松地在搜索引擎中找到各种Linux优越性的说辞,其中不乏Linux的激进者.特别是当你步入VPS领域,更多地 ...

  5. viewPager-基本实现示例

    直接看代码 package com.example.myviewpager; import android.app.Activity; import android.os.Bundle; import ...

  6. php图像处理(thinkphp框架有相对强大的图像处理功能)

    php图像处理(thinkphp框架有相对强大的图像处理功能) 一.总结 1.php处理图像:php处理图像需要安装外库(gd库) 2.gd库函数可以非常完美的操作图像:安装好库之后,这个库里面的函数 ...

  7. GitHub上常用命令(工作中几乎每天用到的命令)

    查看自己当前分支 git branch 查看远程和本地分支 git branch -a 查看origin下的分支 git config -vv git config --lis 创建分支 git br ...

  8. django 简单会议室预约(2)

    --我们先打开settings.py 配置文件: import os #指明django APP目录路径 BASE_DIR = os.path.dirname(os.path.dirname(os.p ...

  9. Scala具体解释---------数组、元组、映射

    一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需newkeyword Scala声明数组时.须要带 ...

  10. Fragment事务管理源代码分析

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/53132952 本文出自: [HansChen的博客] 概述 在Fragment使用中 ...