数独——拥有一定难度的回溯练习题,值得一看

数独相信大家都玩过,也都拥有不同的策略,那么放到C++中又是怎样的呢?其实它就是回溯算法。话不多说,直接用例题来讲解:

Description

数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1−9且不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。

这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”。

据介绍,目前数独游戏的难度的等级有一到五级,一是入门等级,五则比较难。不过这位数学家说,他所设计的数独游戏难度等级是十一,可以说是所以数独游戏中,难度最高的等级。他还表示,他目前还没遇到解不出来的数独游戏,因此他认为“最具挑战性”的数独游戏并没有出现。

Format

Input

一个未填的数独。

Output

填好的数独。

这道题是洛谷上的原题数独 - 洛谷

看着题很长,其实一点也不难,只需要一个点一个点的枚举加上回溯就可以了,再开三个数组来记录当前这一行和这一列以及再一个3*3的格子里的数字的剩余形况。

ACcode

 

#include<bits/stdc++.h>
using namespace std;int h[10][10],l[10][10],a[10][10],ans[10][10],g[5][5][10],cmp;void dfs(int x,int y){if (cmp==1)return;if (x==10&&y==1){for (int i=1;i<=9;i++){for (int j=1;j<=9;j++){cout<<ans[i][j]<<" ";}cout<<endl;}cmp=1;return;}if (a[x][y]!=0){ans[x][y]=a[x][y];if (y==9){dfs(x+1,1);}else {dfs(x,y+1);}return;}else {for (int i=1;i<=9;i++){if (h[x][i]==0&&l[y][i]==0&&g[(x-1)/3+1][(y-1)/3+1][i]==0){h[x][i]=1;l[y][i]=1;g[(x-1)/3+1][(y-1)/3+1][i]=1;ans[x][y]=i;//if (y==9){dfs(x+1,1);}else {dfs(x,y+1);}//h[x][i]=0;l[y][i]=0;g[(x-1)/3+1][(y-1)/3+1][i]=0;}}}return;
}
int main(){for (int i=1;i<=9;i++){for (int j=1;j<=9;j++){cin>>a[i][j];if (a[i][j]!=0){h[i][a[i][j]]=1;l[j][a[i][j]]=1;g[(i-1)/3+1][(j-1)/3+1][a[i][j]]=1;}}}dfs(1,1);return 0;
}

这道题会了的话我们来看一个有一点变形的

Description

题目背景

数独是指满足如下条件的 9×9矩阵:

  • 每一行、每一列都包含从 1 至 9 不重不漏的数字;
  • 将其划分为 9 个 3×3 的小矩阵,每个小矩阵也都包含从 1 至 9 不重不漏的数字。

题目描述

给出一个 9×9 的矩阵,里面填了一些 1 至 9 之间的整数,将其补全为一个完整的数独并输出。未填数的格子以 0 表示。

输入格式

从标准输入读入数据。

输入共 9 行,每行包含 9 个整数 aij​(0≤aij​≤9),整数之间不含空格,代表待补全的数独。

输出格式

输出到标准输出。

如果数独有解,输出共 9 行,每行包含 9 个整数 aij​(1≤aij​≤9),整数之间不含空格,代表填好后的数独。

如果有多于一个解,任意输出一个解即可。

如果数独无解,输出 0 。

这道题其实就只需要再判断完之后输出一个0就可以了,非常的easy

#include<bits/stdc++.h>
using namespace std;int h[10][10],l[10][10],a[10][10],ans[10][10],g[5][5][10],cmp;void dfs(int x,int y){int flag=1;if (cmp==1)return;if (x==10&&y==1){for (int i=1;i<=9;i++){for (int j=1;j<=9;j++){cout<<ans[i][j];}cout<<endl;}cmp=1;exit(0);}if (a[x][y]!=0){ans[x][y]=a[x][y];if (y==9){dfs(x+1,1);}else {dfs(x,y+1);}return;}else {for (int i=1;i<=9;i++){if (h[x][i]==0&&l[y][i]==0&&g[(x-1)/3+1][(y-1)/3+1][i]==0){flag=0;//h[x][i]=1;l[y][i]=1;g[(x-1)/3+1][(y-1)/3+1][i]=1;ans[x][y]=i;//if (y==9){dfs(x+1,1);}else {dfs(x,y+1);}//h[x][i]=0;l[y][i]=0;g[(x-1)/3+1][(y-1)/3+1][i]=0;}}}return;
}
int main(){string s;for (int i=1;i<=9;i++){cin>>s;for (int j=1;j<=9;j++){a[i][j]=s[j-1]-'0';if (a[i][j]!=0){h[i][a[i][j]]=1;l[j][a[i][j]]=1;g[(i-1)/3+1][(j-1)/3+1][a[i][j]]=1;}} }dfs(1,1);cout<<0;return 0;
}

最后我们看一道[NOIP2009 提高组] 靶形数独 - 洛谷——提高+/省选-

题目背景

此为远古题,不保证存在可以通过任意符合要求的输入数据的程序

题目描述

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

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

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

总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。

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

输入格式

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

输出格式

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

首先这道题如果用上面的方法来写的话,只能拿60分,其实这个分数在赛场上是比较可以了的,但是嘛,我们是学习,自然要弄懂才行,所以我们来具体分析分析:

首先我们知道在填数独的时候,一般情况下会去填这一行或这一列已经有比较多的数字了的地方,那么我们可不可以利用这个方法,找到每一行所剩下的位置有几个,然后排一个序,从小往大的去找呢?这个思路就非常非常的好了,可以拿整整100分!

ACcode

#include <bits/stdc++.h>
using namespace std;inline int read(){int x=0;char ch=0;while (ch<'0'||ch>'9')ch=getchar();while (ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();return x;
}//用了一下快读,可以提速
int h[10][10],l[10][10],a[10][10],ans[10][10],g[5][5][10],maxn=-1,cnt=1;int fen[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}};//手动打表struct f{int num=9;int hang;
}sx[10];bool cmp(f a1,f a2){return a1.num<a2.num;
}void dfs(int x,int y){if (cnt==10){int cnt=0;for (int i=1;i<=9;i++){for (int j=1;j<=9;j++){cnt+=ans[i][j]*fen[i][j];}}maxn=max(maxn,cnt);return;}if (a[x][y]!=0){ans[x][y]=a[x][y];if (y==9){cnt++;dfs(sx[cnt].hang,1);cnt--;}else {dfs(x,y+1);}return;}else {for (int i=1;i<=9;i++){if (h[x][i]==0&&l[y][i]==0&&g[(x-1)/3+1][(y-1)/3+1][i]==0){h[x][i]=1;l[y][i]=1;g[(x-1)/3+1][(y-1)/3+1][i]=1;ans[x][y]=i;//if (y==9){cnt++;dfs(sx[cnt].hang,1);cnt--;//这个也要回溯,当初我就是在这里卡了好久}else {dfs(x,y+1);}//h[x][i]=0;l[y][i]=0;g[(x-1)/3+1][(y-1)/3+1][i]=0;}}}return;
}int main(){for (int i=1;i<=9;i++){sx[i].hang=i;//存下行的位置for (int j=1;j<=9;j++){a[i][j]=read();if (a[i][j]!=0){h[i][a[i][j]]=1;l[j][a[i][j]]=1;g[(i-1)/3+1][(j-1)/3+1][a[i][j]]=1;sx[i].num--;}}}sort(sx+1,sx+10,cmp);dfs(sx[cnt].hang,1);cout<<maxn;return 0;
}

 

  看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧

谢谢啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

52 vue 中 image 资源直接使用 路径 和 使用require 的差异

前言 这也是 最近碰到的一个比较有趣的问题 是在 http 请求较多的场景下触发的情况 一般 我们的 Vue 中使用图片的地方, 一般会使用 require(“$imgPath”) 或者 “/$imgPath” 来配置图片的资源 然后 这个在目标页面 http 请求比较多的情况下, 两者 会有一些 差异, 我们…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏&#xff08;TouchScreen&#xff09;和滚动球&#xff08;TrackBall&#xff09;是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球&#xff0c;主要可以通过使用运动事…

沃尔玛百货有限公司 企业网页设计制作 企业html网页成品 跨国公司网页设计开发 web前端开发,html+css网页设计素材,静态html学生网页成品源码

沃尔玛百货有限公司 WalMart 7页面 企业主题 带jquery图片轮播特效 滚动文字 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.or…

如何保证redis里的数据都是热点数据

MySQL 里有 2000w 数据&#xff0c;Redis 中只存 20w 的数据&#xff0c;如何保证 redis 中的数据都是热点数据&#xff1f; 1.Redis 过期删除策略 1&#xff09;惰性删除:放任键过期不管&#xff0c;但是每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c…

华为 Pocket 2 防晒指南:用好这三个功能,再也不用担心被晒伤了!

防晒现在已经是外出护肤的日常操作&#xff0c;但为什么明明涂了防晒霜还是会被晒伤&#xff1f;华为 Pocket 2的出现&#xff0c;为我们带来了全新的防晒解决思路&#xff0c;可以在防晒霜涂抹、晒斑检测、紫外线强度检测三方面帮到我们。 紫外线看不见也摸不着&#xff0c;我…

【跟着CHATGPT学习硬件外设 | 04】ADC

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 1.1 快速入门 模数转换器&#xff08;ADC&#xff0c;Analog-to-Digital Converter&#xff09;是一种将模拟信号转换为数字信号的电子设备。模拟信号通常表示物理测量的连…

【CKA模拟题】案例演示如何创建PVC

Useful Resources: Persistent Volumes Claim 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesA persistent volume named red-pv-cka is available. Your task is to create a Persi…

56、FreeRTOS/GPIO与定时器相关学习20240329

一、代码实现控制开发板上的指示灯闪烁。 /* USER CODE BEGIN 0 */ //利用定时器机制 定时器溢出时对应的回调函数实现如下 //本次实现控制PB0&#xff0c;PB1两个灯 int flag1 0,flag2 0;//使用一个标记执行以下代码 会造成一个灯常亮 另一个常灭 void HAL_TIM_PeriodElaps…

Charles抓包配置代理手机连接

Charles下载地址&#xff1a; Charles_100519.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Charles_100519.zip最新版正式版官方版绿色版下载,Charles_100519.zip安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com…

MIPI RFFE接口

1. 概况 MIPI RFFE是一种专门针对当前及未来无线系统在射频(RF)前端控制界面规范。随着手机射频系统日趋复杂&#xff0c;业界需要一个单一控制界面解决方案。MIPI联盟的RF前端控制界面(RFFE)规范通过提供一个可连接到收发器或无线电的总线界面解决了这一难题&#xff0c;可用于…

【动手学深度学习-pytorch】 9.4 双向循环神经网络

在序列学习中&#xff0c;我们以往假设的目标是&#xff1a; 在给定观测的情况下 &#xff08;例如&#xff0c;在时间序列的上下文中或在语言模型的上下文中&#xff09;&#xff0c; 对下一个输出进行建模。 虽然这是一个典型情景&#xff0c;但不是唯一的。 还可能发生什么其…

Vue中使用Vuex(超详细)基本使用方法

在vue中使用vuex&#xff0c;不同的vue版本要对应使用不同的vuex&#xff0c;在这里不做详情介绍&#xff0c;想具体了解的&#xff0c;请自行度娘或者必应一下。 在使用vuex之前&#xff0c;我们创建一个新的项目&#xff0c;这里我们使用的是vue的脚手架创建一个vue项目。 …

入围中国大模型 + 知识管理最佳案例 15 强,杭州悦数 x 中国船舶项目收获认可!

近期&#xff0c;由国内知名的数字化研究与服务机构沙丘社区发布的《2024 中国“大模型知识管理”最佳实践案例 15 强》新鲜出炉&#xff0c;杭州悦数科技有限公司助力中国船舶集团有限公司第七〇八研究所打造的行业方案“基于图和多级智能体的动态排障知识问答系统”榜上有名。…

vue属性与方法

vue属性与方法 计算属性v-model指令——表单的实现样式绑定 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

对iOS的内存存储的一些理解

最近写项目的时候遇到了一些内存上的问题&#xff08;比如内存泄漏等等&#xff09;&#xff0c;通过网上的方法解决后&#xff0c;好奇iOS的数据是如何存储的&#xff0c;特记于此。 一、iOS的内存区域 iOS 中应用程序使用的计算机内存不是统一分配空间&#xff0c;运行代码使…

【感悟《剑指offer》典型编程题的极练之路】02字符串篇!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章所属专栏&#xff1a;《剑指offer》典型编程题的极练之路 ​​​​​​ 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c…

Leetcode 剑指 Offer II 071.按权重随机选择

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重…

电子级高纯PFA材质实验室器皿耗材PFA漏斗PFA试剂瓶PFA烧杯

PFA三角漏斗&#xff0c;整体均是PFA材质&#xff0c;无污染风险&#xff0c;可高压灭菌。 尺寸&#xff1a;外径40mm、160mm PFA三角漏斗 特点&#xff1a; 1、一体式成型&#xff0c;结构稳定&#xff1b; 2、化学耐受性强&#xff0c;耐受强酸、强碱以及各种有机溶剂&…

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语&#xff0c;用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集&#xff08;Training Set&#xff09;&#xff1a;训练集是用于训练机器学习模型的数据集。在训练期间&#xff0c;模型使用训练集中…

FPGA----ZCU106的petalinux 2019.1使用USB传输数据

1、实际项目中需要用到开发板的串口进行数据交互&#xff0c;之前讲的几节只是启动了网口&#xff08;如下链接&#xff09;。因此&#xff0c;本次给大家带来的官方自带串口例程的使用方法&#xff0c;本文的vivado工程和下述连接一样&#xff0c;PL端什么配置都没有。 FPGA-…