四阶数独——深度优先搜索dfs

文章目录

    • 四阶数独
      • 例题讲解
      • 深度优先dfs搜索知识点
        • 算法思想
        • 应用
        • 代码框架

四阶数独

例题讲解

题目描述

这里讨论一种简化的数独——四阶数独。 给出一个 4×4 的格子,每个格子只能填写 1到 4 之间的整数,要求每行、每列和四等分更小的正方形部分都刚好由 1 到 4组成。求总共有多少种不同的数独?
四阶数独——深度优先搜索dfs_第1张图片
输出结果:288
思路

常规思路就是根据格子序号挨个设置数

四阶数独——深度优先搜索dfs_第2张图片

  1. 如果每次都是从第一个开始设置,暴力枚举,一个格子四种选择, 16个格子 所以就有4^16= 2^32 超时

  2. 因此可以考虑用bfs遍历整个16个格子的方法,每次dfs设置一个数,然后根据格子序号往后设置一个数,但是要考虑到规则:同一行、同一列、同一块方形格子数字不能重复,所以给格子设数时需要设置条件-用三个矩阵分别储存每个小格子的行、列、块所属的位置(同一行设为一个数)如下:

    在这里插入图片描述

    要想每次快速知道其所属行、列、块所属的位置是否已经存在该数,用f1[i] [ k] 表示i行是否存在k列

  3. bfs思路: 每次设置一个格子,标记该各自的所属行列块改数已设,设置完16个格子回溯回到上一个格子,然后再设置其他可选的数,

数据约束

暂无

参考代码

#include 
using namespace std;
const int N = 17;
int arr[20],ans = 0;//至少长度为17  储存存放的数据
//标注每个格子对应的行列块 
int hang[] = {
   0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4} ;
int lie[] = {
   0,1,2,3,4,
			   1,2,3,4,
			   1,2,3

你可能感兴趣的:(c++,深度优先,算法)