信息学奥赛一本通T1447:靶形数独

【题目描述】

小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。

靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入1 到9 的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)

​编辑

上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色区域)每个格子为9 分,再外面一圈(蓝色区域)每个格子为8 分,蓝色区域外面一圈(棕色区域)每个格子为7 分,最外面一圈(白色区域)每个格子为6 分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为2829。游戏规定,将以总分数的高低决出胜负。

​编辑

由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。

【输入】

一共 9 行。每行9 个整数(每个数都在0—9 的范围内),表示一个尚未填满的数独方格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。

【输出】

共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

样例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

【输出样例】

样例1

2829

样例2

2852

【源程序】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int g[N][N];
int grade[10][10] { //得分{0,0,0,0,0,0,0,0,0,0},{0,6,6,6,6,6,6,6,6,6},{0,6,7,7,7,7,7,7,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,9,10,9,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,7,7,7,7,7,7,6},{0,6,6,6,6,6,6,6,6,6},
};
int area[10][10] { //宫{0,0,0,0,0,0,0,0,0,0},{0,1,1,1,2,2,2,3,3,3},{0,1,1,1,2,2,2,3,3,3},{0,1,1,1,2,2,2,3,3,3},{0,4,4,4,5,5,5,6,6,6},{0,4,4,4,5,5,5,6,6,6},{0,4,4,4,5,5,5,6,6,6},{0,7,7,7,8,8,8,9,9,9},{0,7,7,7,8,8,8,9,9,9},{0,7,7,7,8,8,8,9,9,9},
};
struct Node {int x;int y;
} point[N*10];
int vis_x[N][N],vis_y[N][N],vis_g[N][N];
int vis[N*10];
int n,sum;
void dfs(int k) {if(k>n) { //当确定的数字个数大于未填入的数字总数时int cnt=0;for(int i=1; i<=9; i++) //记录分值for(int j=1; j<=9; j++)cnt+=g[i][j]*grade[i][j];sum=max(sum,cnt);//取最大分值return;}int w=INF,temp;for(int i=1; i<=n; i++){ //确定搜索的起点if(!vis[i]) {int ww=0;for(int j=1; j<=9; j++)if( !vis_x[point[i].x][j] && !vis_y[point[i].y][j] && !vis_g[area[point[i].x][point[i].y]][j] )if(++ww==w)break;if(ww<w) {w=ww;temp=i;}}}vis[temp]=1;int x=point[temp].x;int y=point[temp].y;for(int i=1; i<=9; i++){ //枚举每一层可能的状态if( !vis_x[x][i] && !vis_y[y][i] && !vis_g[area[x][y]][i] ) { //如果当前数字在整个图的横向纵向小区域内未出现过g[x][y]=i;vis_x[x][i]=1;vis_y[y][i]=1;vis_g[area[x][y]][i]=1;dfs(k+1);vis_x[x][i]=0;vis_y[y][i]=0;vis_g[area[x][y]][i]=0;}}vis[temp]=0;
}
int main() {for(int i=1; i<=9; i++){for(int j=1; j<=9; j++) {scanf("%d",&g[i][j]);if(g[i][j]) {vis_x[i][g[i][j]]=1;//标记行vis_y[j][g[i][j]]=1;//标记列vis_g[area[i][j]][g[i][j]]=1;//标记图}else { //如果当前点未填入数字/*记录未填入数字*/n++;point[n].x=i;point[n].y=j;}}}sum=-1;dfs(1);cout<<sum<<endl;return 0;
}

信息学奥赛一本通T1447:靶形数独相关推荐

  1. 靶形数独(信息学奥赛一本通-T1447)

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

  2. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”

    董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...

  3. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  4. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  5. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  6. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC

    http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

最新文章

  1. python做测试书籍推荐_学习pytest应该观看的书籍?
  2. Java递归基础案例-回文字符串的判断
  3. 用conda安装虚拟的R环境
  4. SpringBoot是什么?
  5. IOS图像拉伸解决方案
  6. python开发软件的实例-由Python编写的MySQL管理工具代码实例
  7. 【NLP】EMNLP 2019 参会小结及最佳论文解读
  8. post请求测试软件,简单的Http请求测试工具(支持get,post)
  9. EnlightenGAN: Deep Light Enhancement without Paired Supervision
  10. C#制作简陋英语背作文辅助小软件
  11. python 定时器、每天凌晨3点执行方法_python 定时器,实现每天凌晨3点执行的方法...
  12. 团队中的“个人英雄主义”
  13. 北京元阔装饰安徽分公司 装修过后两年不到的墙面 及 相关
  14. 拦截CSDN顶端广告
  15. Matlab求单边谱,关于实信号的双边谱和单边谱
  16. python怎么在图片上写字_python在图片上写汉字
  17. [CF1131F] Asya And Kittens
  18. 跟叶子学把妹——教程序猿把妹第二集
  19. 拼多多收php吗_php调用拼多多的接口
  20. 关于widedeep的再思考

热门文章

  1. 【附源码】计算机毕业设计Python安卓少儿英语在线学习平台APPodto4(源码+程序+LW+调试部署)
  2. 陌陌年度盛典幕后:“社交+直播”的新价值释放
  3. 【解决】:不能删除旧版本的Apple Software Update
  4. 判断一个对象为空对象的五种方法
  5. SpringBoot应用接入Prometheus的全过程解析
  6. Baostock学习系列2:批量下载股市日交易明细
  7. 字符串---美丽的图形
  8. 蓝桥杯BASIC-3(字母图案)
  9. Windows系统权限
  10. 十 iOS 之UIVIew动画 和 核心动画的区别