题目描述 Description

小城和小华都是热爱数学的好学生,最近,他们不约而同地

迷上了数独游戏,好胜的他们想用数独来一比高低。但普通

的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z

博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的

题目。靶形数独的方格同普通数独一样,在 9 格宽×9 格高的

大九宫格中有9 个3 格宽×3 格高的小九宫格(用粗黑色线隔

开的)。在这个大九宫格中,有一些数字是已知的,根据这些

数字,利用逻辑推理,在其他的空格上填入1到9 的数字。每个

数字在每个小九宫格内不能重复出现,每个数字在每行、每列

也不能重复出现。但靶形数独有一点和普通数独不同,即

每一个方格都有一个分值,而且如同一个靶子一样,离中心

越近则分值越高。

上图具体的分值分布是:最里面一格(黄色区域)为 10 分,

黄色区域外面的一圈(红色区域)每个格子为9 分,再外面

一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕

色区域)每个格子为7 分,最外面一圈(白色区域)每个格

子为6 分,如上图所示。比赛的要求是:每个人必须完成一

个给定的数独(每个给定数独可能有不同的填法),而且要

争取更高的总分数。而这个总分数即每个方格上的分值和完

成这个数独时填在相应格上的数字的乘积的总和。如图,在

以下的这个已经填完数字的靶形数独游戏中,总分数为2829。

游戏规定,将以总分数的高低决出胜负。由于求胜心切,小城

找到了善于编程的你,让你帮他求出,对于给定的靶形数独,

能够得到的最高分数。

输入描述 Input Description

一共 9 行。每行9 个整数(每个数都在0—9 的范围内),表示一个尚

未填满的数独方格,未填的空格用“0”表示。每两个数字之间用一个空

格隔开。

输出描述 Output Description

输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。

样例输入 Sample Input

【输入输出样例 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

【输入输出样例 2】

0 0 0 7 0 2 4 5 3
9 0 0 0 0 8 0 0 0
7 4 0 0 0 5 0 1 0
1 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

样例输出 Sample Output

【输入输出样例 1】

2829

【输入输出样例 1】

2852

数据范围及提示 Data Size & Hint

【数据范围】
40%的数据,数独中非0 数的个数不少于30。
80%的数据,数独中非0 数的个数不少于26。
100%的数据,数独中非0 数的个数不少于24。

题解:爆搜

记录0的位置 只填0 卡时

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include<iostream>
using namespace std; int block_index[][] = {{},
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , }
}; int value[][] = {{},
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , ,, , ,},
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , }
}; int map[][];
int pos[][]; ////zeros
bool line[][], row[][], block[][]; //vis
int res = -;
int times; void dfs(int zeros, int sum)
{
if(!zeros)
{
if(sum > res)res = sum;
return;
}
if(times++ > )return;
int i = pos[zeros][], j = pos[zeros][];
for(int k = ; k <= ; k++) //place number
{
if(!line[i][k] && !row[j][k] && !block[block_index[i][j]][k])
{
line[i][k] = row[j][k] = block[block_index[i][j]][k] = true;
dfs(zeros - , sum + k * value[i][j]);
line[i][k] = row[j][k] = block[block_index[i][j]][k] = false;
}
}
} int main()
{
int tot = ;
int zeros = ;
for(int i = ; i <= ; i++)
{
for(int j = ; j < ; j++)
{
int vvv;
scanf("%d", &vvv);
if(map[i][j] = vvv)
{
line[i][vvv] = row[j][vvv] = block[block_index[i][j]][vvv] = ;
tot += vvv * value[i][j];
}else
{
zeros++;
pos[zeros][] = i;
pos[zeros][] = j;
}
}
}
dfs(zeros, tot);
printf("%d\n", res? res: -);
return ;
}

挨个填..洛谷只能95分,codevs上A了,因为codevs的时限是4s...洛谷1s....

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstring>
#include<algorithm>
using namespace std;
int cnt,ans,map[][],row[][],col[][],cub[][];
int score[][]={
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,
},
bel[][]={
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,,,
}; inline int read(){
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} void dfs(int x,int y,int sum){
if(x==){
if(sum>ans)ans=sum;
return;
}
if(map[x][y]){
if(y==)dfs(x-,,sum+map[x][y]*score[x][y]);
else dfs(x,y-,sum+map[x][y]*score[x][y]);
}
for(register int i=;i<=;i++){
if(row[x][i]==&&col[y][i]==&&cub[bel[x][y]][i]==){
row[x][i]=col[y][i]=cub[bel[x][y]][i]=true;
int cnt=sum+score[x][y]*i;
if(y==)dfs(x-,,cnt);
else dfs(x,y-,cnt);
row[x][i]=col[y][i]=cub[bel[x][y]][i]=false;
}
}
} int main(){
for(register int i=;i<=;i++){
for(int j=;j<=;j++){
int x;
x=read();
map[i][j]=x;
if(x){
row[i][x]=true;
col[j][x]=true;
cub[bel[i][j]][x]=true;
}
}
}
ans=-;
dfs(,,);
if(ans<)printf("-1\n");
else printf("%d\n",ans);
return ;
}

最普通的正着搜  没有任何剪枝 洛谷75分

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int ans,js; int a[][],hang[][],lie[][],q[][]; int score[][]={
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , ,, , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , }
}; int bel[][]={
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , },
{, , , , , , , , , }
}; void dfs(int x,int y,int now){
// cout<<now<<endl;
if(x==){
ans=max(ans,now);
return;
}
if(a[x][y]){
if(y==)dfs(x+,,now+a[x][y]*score[x][y]);
else dfs(x,y+,now+a[x][y]*score[x][y]);
}else{
for(register int i=;i<=;i++){
if(hang[x][i]||lie[y][i]||q[bel[x][y]][i])continue;
a[x][y]=i;
hang[x][i]=lie[y][i]=q[bel[x][y]][i]=true;
if(y==)dfs(x+,,now+a[x][y]*score[x][y]);
else dfs(x,y+,now+a[x][y]*score[x][y]);
a[x][y]=;
hang[x][i]=lie[y][i]=q[bel[x][y]][i]=false;
}
}
} int main(){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
scanf("%d",&a[i][j]);
if(a[i][j]){
hang[i][a[i][j]]=true;
lie[j][a[i][j]]=true;
q[bel[i][j]][a[i][j]]=true;
}
}
}
dfs(,,);
printf("%d\n",(ans==?-:ans));
return ;
}

CODEVS 1174 靶形数独的更多相关文章

  1. 靶形数独(codevs 1174)

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

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

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

  3. 【CodeVS】p1174 靶形数独

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

  4. NOIp 2009:靶形数独

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

  5. Vijos1775 CodeVS1174 NOIP2009 靶形数独

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

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

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

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

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

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

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

  9. NOIP2009 靶形数独

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

随机推荐

  1. JavaScript 的简单学习2

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...

  2. octotree神器 For Github and GitLab 火狐插件

    Code tree for GitHub and GitLabExtension to show code tree for GitHub and GitLab. Useful for develop ...

  3. Linux的Cache Memory(缓存内存)机制

    转:https://blog.csdn.net/kaikai_sk/article/details/79177036 PS:为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与W ...

  4. RHCE学习笔记 管理1 (第三~五章)

    第三章 红帽企业linux 获取帮助 (略) man .pinfo. 第四章 编辑文件 1.输出重定向到文件和程序 >file    定向文件(覆盖) >>file   定向文件(附 ...

  5. IOS 发布被拒 3.2 f

    Dear Developer, We have determined that your Apple Developer Program membership, or another membersh ...

  6. 回溯法之k着色问题

    package main import ( "fmt" ) type Graphic struct { edges [][]int colors int color []int f ...

  7. python global

    如果想在函数内部改变函数外的变量值,用global语句完成: 在不传该变量值入函数的情况下要改变它的值: >>> a = 3 >>> def f(): ... gl ...

  8. sql 触发器回顾

    一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器 ...

  9. Android之动画1

    点此下载 package com.example.animationdemo; import java.util.Timer; import java.util.TimerTask; import a ...

  10. python的常见排序

    在python程序中,我们往往自始至终都在与序列(列表.字典.元组)打交道,而最常用的操作就是对序列排序了.在此简单总结一下python中的排序. 基本排序方法 在python中,list对象具有 s ...