定义

数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

算法思想

启发式搜索算法,针对摒弃法的改进。
先算出所有空格的候选数,然后找到候选数个数最少的位置开始搜索。如果不满足则回退。

代码

# -*- coding: utf-8 -*-
# @Time    : 2022/5/2 14:58
# @Author  : kunkun
# @File    : algorithm3.py
# ------------------------------
# 启发式搜索算法,针对算法2的改进。
# 先算出所有空格的候选数,然后找到候选数个数最少的位置开始搜索。
import numpy as npsudoku = np.zeros((9, 9), dtype=np.int32)  # 存储数独矩阵def cal_blank():# 计算空格的个数count = 0coord = []for i in range(9):for j in range(9):if sudoku[i][j] == 0:coord_tmp = [i, j]  # 记录坐标coord.append(coord_tmp)count += 1return count, coorddef blank_candidate(coord, count):candidate_list = []  # 保存没哟个空格位置的候选列表for i in range(count):num = [1, 2, 3, 4, 5, 6, 7, 8, 9]# 取坐标x = coord[i][0]y = coord[i][1]# 找九宫格位置start_row = x // 3start_col = y // 3# 行去重复数字for j in range(9):if sudoku[x][j] in num:num.remove(sudoku[x][j])# 列去重复数字for j in range(9):if sudoku[j][y] in num:num.remove(sudoku[j][y])# 九宫格去重复数字for j in range(start_row * 3, start_row * 3 + 3):for k in range(start_col * 3, start_col * 3 + 3):if sudoku[j][k] in num:num.remove(sudoku[j][k])candidate_list.append(num)return candidate_listdef min_index(candidate_list, coord, count):# 找到最小候选个数的位置candidate_len = []for i in range(count):lens = len(candidate_list[i])candidate_len.append(lens)min_len = min(candidate_len)  # 最小候选个数index = candidate_len.index(min_len)  # 最小候选个数索引return min_len, index, coord[index]def search_algorithm():# 计算需要填空的坐标及个数:坐标列表:coord,个数:countcount, coord = cal_blank()total_count = 0  # 记录总的迭代次数# 弹出的候选数列表pop_candi_list = []# 弹出坐标列表pop_coord_list = []while count:# 计算空白位置的候补列表candidate_tmp = blank_candidate(coord, count)# 计算最小候补个数的位置min_len, index, min_coord = min_index(candidate_tmp, coord, count)# print(total_count, candidate_tmp[index], min_coord)if min_len == 0:while len(pop_candi_list[-1]) == 0:# 上一个空格的坐标x = pop_coord_list[-1][0]y = pop_coord_list[-1][1]# 还原当前节点的值sudoku[x][y] = 0count = count + 1coord.append(pop_coord_list[-1])# 删除当前节点坐标及侯选数列表del pop_coord_list[-1]del pop_candi_list[-1]# 上一个空格位置重新填数x = pop_coord_list[-1][0]y = pop_coord_list[-1][1]sudoku[x][y] = pop_candi_list[-1][0]del pop_candi_list[-1][0]total_count += 1else:# 更改min_coord处的值x = min_coord[0]y = min_coord[1]sudoku[x][y] = candidate_tmp[index][0]# 取出min_coord位置处的候选数删除候选数的第一项后放到弹出来的候选数列表中tem_list = candidate_tmp.pop(index)del tem_list[0]pop_candi_list.append(tem_list)# 取出min_coord的位置放到弹出来的坐标列表中tem_coord = coord.pop(index)pop_coord_list.append(tem_coord)count = count - 1total_count += 1print(f'共迭代{total_count}次')if __name__ == '__main__':sudoku = [[0, 0, 5, 3, 0, 0, 0, 0, 0],[8, 0, 0, 0, 0, 0, 0, 2, 0],[0, 7, 0, 0, 1, 0, 5, 0, 0],[4, 0, 0, 0, 0, 5, 3, 0, 0],[0, 1, 0, 0, 7, 0, 0, 0, 6],[0, 0, 3, 2, 0, 0, 0, 8, 0],[0, 6, 0, 5, 0, 0, 0, 0, 9],[0, 0, 4, 0, 0, 0, 0, 3, 0],[0, 0, 0, 0, 0, 9, 7, 0, 0]]search_algorithm()for i in range(9):print(sudoku[i])

总结

针对摒弃法的改进,考虑了一种启发式的搜索算法,核心思想仍然是模拟人的解题思路。为了跳出传统方法,下面将尝试运用一些新的方法解决数独问题。

启发式搜索算法解决数独问题sudoku,附python实现相关推荐

  1. 摒弃法解决数独问题sudoku,附python实现

    定义 数独是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1 ...

  2. 利用深度优先搜索算法解决老鼠吃奶酪问题(python)

    问题描述 一只老鼠位于迷宫左下角(0,0),迷宫中的数字9处有块大奶酪.0表示墙,1表示可通过路径.试给出一条可行的吃到奶酪的路径:若没有返回空. 假定迷宫是4连通的,即:老鼠只能上下左右走,不能斜着 ...

  3. 【人工智能大作业】A*和IDA*搜索算法解决十五数码(15-puzzle)问题 (Python实现)(启发式搜索)

    Astar和IDAstar搜索算法解决十五数码(15-puzzle)问题 (文末附实现代码,此前为理论与具体问题分析) 文章目录 Astar和IDAstar搜索算法解决十五数码(15-puzzle)问 ...

  4. 用 Python 解数独(Sudoku)

    芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独.数独是 9 横 9 竖共有 81 个格子,同时又分为 9 个九宫格.规则很简单:每个空格填入 1~9 任意一个数字,需要保证每个横排和竖 ...

  5. 解决数独问题用人工智能还是量子计算?

    作为一种有趣的棋盘游戏,数独诞生100周年之后,它是如何成为计算研究的焦点之一的呢?探索如何使用人工智能或量子计算机从头开始创建一个智能数独求解器. 在深入探究之前,先来了解一下历史 马克•布洛赫说: ...

  6. quantum_用ai或Quantum解决数独

    quantum 人工智能 , 计算机科学 (Artificial Intelligence, Computer Science) 深入了解之前的一些历史记录: (A little bit of his ...

  7. 你必须会的启发式搜索算法--A*算法

    一.算法原理 A* 算法,就是解决在一个平面 grid地图中寻找起点到终点的最短路径问题的算法,类似于Dijkstra算法和BFS算法一样,属于广度优先搜索.实际上它还是一个启发式搜索算法,什么叫启发 ...

  8. 遗传算法解决tsp问题(基于python)

    目录 1.遗传算法简要介绍 2.tsp问题简要介绍 3.遗传算法解决tsp问题的几个特殊点 4.源码 1.遗传算法简要介绍 简单来说,遗传算法是用于解决最优化问题的一种搜索算法.其核心基于自然界种群进 ...

  9. A*启发式搜索算法详解 人工智能

    A*启发式搜索算法详解 人工智能 我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地.路径搜索(Pathfinding)的目标是找到一条好的路径--避免障碍物.敌人,并把 ...

最新文章

  1. Centos7 使用Docker安装tomcat
  2. 五问智能教育未来发展:重点解决什么问题?
  3. python opencv 归一化
  4. [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法
  5. 开卡教程_流量卡开卡教程(必看)
  6. str()和repre()的区别
  7. Axios的Vue插件(添加全局请求/响应拦截器)
  8. 在C语言中巧用正则表达式
  9. JVM体系结构与工作方式
  10. 基于yolo的口罩识别(开源代码和数据集)
  11. 手部精细动作有哪些_3-6岁手部精细动作训练游戏!促进孩子大脑发育
  12. eclipse启动tomcat无法访问的解决方法(转)
  13. Google Calendar Sync_ 把 Microsoft Outlook 同步到 G...
  14. sql注入检测工具 mysql_Java自动化SQL注入测试工具—jSQL Injection v0.5
  15. 信息安全和网络空间安全
  16. 汉字排序法(汉字转拼音)
  17. 仿支付宝股票 猜涨跌View
  18. 第九章泛型与集合(甘琳凤)
  19. 使用百度云GPU主机做深度学习
  20. Mantis 安装与配置

热门文章

  1. 磁盘阵列mdadm磁盘配额
  2. Intellij idea:查找,定位文件的位置
  3. LVGL官方文档-7.11.0-4-Porting-Display interface
  4. 苏州企业准备高企申报材料时,研发项目RD表这些你都了解吗
  5. 根据url获取文件流MultipartFile
  6. 佳明手表大数据应用_你的Garmin,平时都用对了吗?
  7. 【NLP屠夫系列】- NER之实战BILSTM
  8. java 美发管理系统_基于安卓Android潮流美发系统APP设计(MySQL)
  9. 使用vscode + gcc进行 STM32 单片机开发(三)DMA读写SD卡,移植FATFS文件系统
  10. 嵌入式: 数字示波表