Python果然不得了,数独都能轻松解决?python秒解数独了解下?

本文介绍了如何使用Python解决数独问题,包括数独规则、解题思路和具体代码实现。通过创建Sudoku类,利用回溯算法进行尝试与判断,实现了在不同操作系统和Python版本上的数独求解功能。
摘要由CSDN通过智能技术生成

数独的规则

1、数字 1-9 在每一行只能出现一次。

2、数字 1-9 在每一列只能出现一次。

3、数字 1-9 在每一个 3x3 宫内只能出现一次。3x3 的宫内为A1-C3,A4-C6,A7-C9,D1-F3,D4-F6,D7-F9…

数独题目示例

在这里插入图片描述

大致思路

1、数独我们使用一个二维列表存储,没有值的位置我们使用’'空字符窜占位。(二维数组)

2、得到每一个3*3的宫内,每一行,每一列已有的数据,然后存放起来。3、得到所有的空缺位置,再遍历空缺位置,尝试放置数据,然后进行判断,如果满足条件安继续放置下一个。以此类推,在途中有不满足条件的情况,就进行回溯,返回上一次满足条件的情况,在进行另一次尝试。
在这里插入图片描述

演示环境

  • 操作系统:windows10
  • python版本:python 3.7
  • 代码编辑器:pycharm 2018.2

具体代码

1、首选我们创建一个类SudoKu。编写构造函数。

学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687
有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流!

class SudoKu():
    def __init__(self,sudo_ku_data):
        # 判断传入的数独是否满足格式
        if not isinstance(sudo_ku_data,list):
            raise TypeError(f'sudo_ku_data params must a list, but {sudo_ku_data} is a {type(sudo_ku_data)}')

        if len(sudo_ku_data) != 9 or len(sudo_ku_data[0]) != 9:
            raise TypeError(f'sudo_ku_data params must a 9*9 list, but {sudo_ku_data} is a {len(sudo_ku_data)}*{len(sudo_ku_data[0])} list')

        self.sudo_ku = sudo_ku_data
        # 存放每一行已有的数据
        self.every_row_data = {
   }
        # 每一列已有的数字
        self.every_column_data = {
   }
        # 每一个3*3宫内有的数字
        self.every_three_to_three_data = {
   }
        # 每一个空缺的位置
        self.vacant_position = []
        # 每一个空缺位置尝试了的数字
        self.every_vacant_position_tried_values = {
   }

2、编写添加每一行,每一列,每一宫方法,方便我们后面调用

def _add_row_data(self,row,value):
    '''
    添加数据到self.every_row_data中,即对每一行已有的数据进行添加
    :param row:
    :param value:
    :return:
    '''
    # 如果当前行不存在,就以当前行为key,初始化值为set()(空的集合)
    if row not in self.every_row_data:
        self.every_row_data[row] = set()

    # 如果这个值已经出现过在这一行了,说明传入的不是一个正确的数独
    if value in self.every_row_data[row]:
        raise TypeError(f'params {self.sudo_ku} is a invalid SudoKu')

    self.every_row_data[row].add(value)

def _add_column_data(self,column,value):
    '''
    添加数据到self.every_column_data中,上面的函数思路一样
    :param column:
    :param value:
    :return:
    '''
    if column not in self.every_column_data:
        self.every_column_data[column] = set()

    if value in self.every_column_data[column]:
        raise TypeError(f'params {self.sudo_ku} is a invalid SudoKu')

    self.every_column_data[column].add(value)

def _get_three_to_three_key(self,row,column):
    '''
    得到该位置在哪一个3*3的宫内
    :param row:
    :param column:
    :return:
    '''
    if row in [0,1,2]:
        if column in [0,1,2]:
            key = 1
        elif column in [3,4,5]:
            key = 2
        else:
            key = 3
    elif row in [3,4,5]:
        if column in [0,1,2]:
            key = 4
        elif column in [3,4,5]:
            key = 5
        else:
            key = 6
    else:
        if column in [0,1,2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python数独,可以按照以下步骤进行操作: 1. 首先,将待数独转换成Python矩阵。可以使用Python中的列表来表示数独的矩阵结构。 2. 接下来,可以使用递归的方法尝试数独。递归是一种重复调用函数自身的方法,可以用于解决数独问题。 3. 在递归函数中,可以编写代码来判断数独是否已经出。可以检查每个格子是否已经填满,并且保证每一行、每一列和每个小九宫格中的数字都不重复。 4. 如果数独出,则需要使用回溯法。回溯法是一种试错的方法,当某一步操作导致数独时,需要返回上一步并尝试其他可能的数字。 5. 通过递归和回溯的不断尝试,直到将数独出为止。 以下是一个示例代码的框架,可以参考来编写Python数独的程序: ```python def solve_sudoku(board): if is_sudoku_solved(board): return True # 找到一个空格子 row, col = find_empty_cell(board) for num in range(1, 10): if is_valid_move(board, row, col, num): board[row][col = num if solve_sudoku(board): return True board[row][col = 0 return False def is_sudoku_solved(board): # 检查数独是否已出 pass def find_empty_cell(board): # 找到一个空格子 pass def is_valid_move(board, row, col, num): # 判断当前数字是否可以放置在指定位置 pass # 主函数 def main(): # 初始化数独矩阵 board = [ [5, 3, 0, 0, 7,0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9] ] # 数独 solve_sudoku(board) # 打印出的数独矩阵 for row in board: print(row) if __name__ == '__main__': main() ``` 通过以上步骤和示例代码,可以使用Python数独问题。注意,以上代码只是一个框架,具体的实现细节需要根据实际需求进行修改和完善。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [6个步骤教你用Python数独!(含实例代码)](https://blog.csdn.net/weixin_41334453/article/details/102805525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值