首页 > 编程语言 >回溯算法解数独问题

回溯算法解数独问题

时间:2022-11-12 00:23:12浏览次数:40  
标签:格子 填入 true 九宫格 算法 回溯 解数 方法

好久没写算法了,浅解个数独

本篇代码以伪代码为主,主要讲解解题思路


规则介绍:

首先数独的游戏规则,每个九宫格 每一行 每一列 每个数字只能出现一次(1-9)

开局时会生成一些不能改变数字的格子

按规则填满所有格子为过关

图下所示为前几天朋友卡关了的状态:

例如第二行第一列有一个固定的5,在它的九宫格里就不能再出现另一个5

第二行也不能再出现5,第一列也不能再出现5


回溯思路:

我需要一个方法能够解这道题,我称呼他为方法A

需要调用方法A就能自动解开这道题,但是按照回溯算法的解题思路,方法A中的核心代码只需要解开一个格子的值,然后在下一个格子的位置再调用方法A

就有了如下伪代码:

布尔 方法A(int x,int y){
//此处先省略解开当前格子的代码 传入的参数为格子的坐标
返回 方法A(x,y+1);
}

这样的话,只需要调用方法A(0,0) 在解开一个格子后,他会自动去解下一个坐标的格子

最终返回true表示解开了这道数独,否则没解开

但是一行只有9个格子,一共9列,所以添加如下代码自动换行(添加到方法顶端,先判断是否越界再运行核心代码):

if (x > 8) {
    return true;
}
if (y > 8) {
    return 方法A(x + 1, 0);
}

现在这个方法已经会自动寻找下一个格子了

但是如果这个格子里的数值是不能修改的,就应该跳过这个格子

我的方法是开始运行前就遍历一遍格子,如果值不为0(开始求解前就有值),就把这个格子标记为不可变

if(此格子的数值不可变){
    return 方法A(x,y+1);
}

即使这里的y+1超过了下标上限,运行到下一个格子的时候也会自动修正


以上是部分回溯,当然后续还会根据情况修改

解题思路:

说明:我将开始解题前就有值的格子称为不可变格子,因为里面的值是固定的,不能改变

1、首先找到这个格子能填入的所有数值

以图中(0,0)为例,第0下标列中有5,4,1,7 第0下标行中有6,3,2 所在的九宫格中有5,1,7 所以这个格子只能填入8,9

提醒:

这个格子所在的九宫格里所有格子的特征:格子的行号除以3相等 格子的列号除以3相等

(左上角这个九宫格里的任何格子 行号除以3都为0 列号除以3都为0 而下面的九宫格行号除以3为1 列号除以3为0)

 

2、依次尝试能填的所有数字

先填入8,然后进行下一个格子,运行中如果发现下一个格子怎么填都不正确,说明前面的格子有存在错误的,则值清0,返回前面的格子,接着试下一个答案

例如:

(0,0)格子填入8,进入下一个格子 即调用了方法A(0,1) (0,1)格子中只能填入4,9 结果发现填哪个都不行,只能把自己重新赋值0 返回false

(0,0)接收到false 继续尝试下一个 尝试填入9 继续调用方法A(0,1)

以此类推,直到得到正确答案 如果所有值都试完了 都没有正确答案 则返回false

所以回溯部分的代码也需要一些修改

for(可填入的数字的集合){
格子(x,y)=可填入的数字
if(方法A(x,y+1)){ return true; } }
格子(x,y)=0
return false;

运行起来大概是这个样子

如果得到正确的解,会从最后一个格子返回 true

而前面的格子都是使用if(方法A(x,y+1))调用的后面的格子

接收到true后也会返回true 直到最初的方法A(0,0)也返回true

如果所有的方案都无法得到解 尝试完所有方案后 也会依次返回false

 

标签:格子,填入,true,九宫格,算法,回溯,解数,方法
From: https://www.cnblogs.com/qian-136/p/16882503.html

相关文章

  • 基于prim算法的网络最小生成树生成得到路径规划
    目录一、理论基础二、核心程序三、测试结果一、理论基础普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的......
  • 道长的算法笔记:二分图匹配
    二分图的概念二分图又称作二部图,是图论中的一种特殊模型。假设\(G=(V,E)\)是一个无向图,如果顶点\(V\)能够分割为两个互不相交的子集\((S,T)\),并且图中的每条边\((......
  • 献芹奏曝-Python面试题-算法-DFS&BFS
    上一篇:献芹奏曝-Python面试题    开篇的话:本文目的是收集和归纳力扣上的算法题,希望用python语言,竭我所能做到思路最清奇、代码最简洁、方法最广泛、性能最高效,了解......
  • 算法笔记(三):数学问题
    最大公约数辗转相除法intgcd(inta,intb){ if(b==0)returna; returngcd(b,a%b);}最小公倍数根据最大公约数得出最小公倍数步骤:先求得a与b的最大公......
  • 算法笔记(二):知识点补充
    万能头文件#include<bits/stdc++.h>数组最大范围int型一维数组:小于4e8,即4亿int型二维数组:小于2e4,即2万数据类型范围int和long都是用32位来存储最大值和最小值分......
  • Floyd算法的关键点
    Floyd算法的代码很简单,就是三个for这个算法最重要的地方就是中转点的枚举for(intk=1;k<=n;k++)for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)g[i][j]=max(g[i][j],g[i......
  • 旋转门数据压缩算法在PostgreSQL中的实现 - 流式压缩在物联网、监控、传感器等场景的
      背景在物联网、监控、传感器、金融等应用领域,数据在时间维度上流式的产生,而且数据量非常庞大。例如我们经常看到的性能监控视图,就是很多点在时间维度上描绘的曲线......
  • 回溯算法dfs: lc46全排列 lc47全排列ll
    result=[] defbacktrack(路径,选择列表):if满足结束条件:result.add(路径)returnfor选择in选择列表:做选择backtrack(路径,选择列表)撤销选择 46全......
  • 实验三:朴素贝叶斯算法实验
    【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;熟悉s......
  • Yolo轻量级网络,超轻算法在各硬件可实现工业级检测效果(附源代码)
    计算机视觉研究院专栏作者:Edison_G目标检测是现在最热门的研究课题,也一直是工业界重点研究的对象,最近几年内,也出现了各种各样的检测框架,所属于YOLO系列是最经典也是目前被大......