数独算法+文件读取+结果保存到文件+Python3版本

操作系统:win10 64bit

Python版本:Python 3.7.3

        数独算法很多,在网上找了个C语言的,感觉还不错,用python改了一下,增加文件操作,从文件读取数独题目,运行后,把结果保存到文件里。经过调试,运行成功。

 

#!/usr/bin/python

#数独算法:根据网上C语言改编而成

#打印列表
def print_list(arr):
    print("") #换行
    for i in range(9):
        for j in range(9):
            print(arr[i][j], end="") #不换行
        print("") #换行

#列表转字符串
def list_to_str(arr):
    ret = ""
    for i in range(9):
        for j in range(9):
            ret += str(arr[i][j])
        ret += "\n"
    return ret

# 判断行列数字是否重复
def is_row_col_repeat(arr, row, col, num):
    for i in range(9):
        if arr[row][i] == num:
            return False

    for i in range(9):
        if arr[i][col] == num:
           return False

    return True

# 根据行,获取9宫格所在行的基准位置
def check_row_range(row):
    if(row >= 0 and row <=2):
           return 0
    elif(row >=3 and row <= 5):
           return 3
    else:
           return 6

# 根据列,获取9宫格所在列的基准位置
def check_col_range(col):
    if(col >= 0 and col <= 2):
           return 0
    elif(col >=3 and col <= 5):
           return 3
    else:
           return 6

# 判断数字在当前九宫格内是否重复
def is_block_repeat(arr, row, col, num):
    x = check_row_range(row)
    y = check_col_range(col)
    for i in range(x,x+3):
        for j in range(y,y+3):
            if arr[i][j] == num:
                return False

    return True


def cal_shudu(arr, row, col):
    if(row > 8):
        print_list(arr)
        save_result_to_file(arr)
        return True
    if(arr[row][col] == 0):
        for i in range(1,10):
            if(is_row_col_repeat(arr, row, col, i) and is_block_repeat(arr, row, col, i)):
                arr[row][col] = i
                cal_shudu(arr, row+(col+1)//9, (col+1)%9)
        arr[row][col] = 0
    else:
        cal_shudu(arr, row+(col+1)//9, (col+1)%9)

def save_result_to_file(arr):
    result = list_to_str(arr)
    fo = open("shudu_result.txt", "a")
    fo.write("\n")
    fo.write(result)
    fo.close()

def read_data_from_file():
    list_raw = [0 for i in range(0)]
    list2 = [[0 for i in range(0)] for j in range(0)]
    with open("shudu.txt", "r") as fl:
        rawdata = fl.read()
        rawdata = rawdata.replace('\n','').replace('\r', '').replace(' ', '')
        #print(type(rawdata))

    for i in range(81):
        list_raw.append(int(rawdata[i]))

    for i in range(9):
        list2.append(list_raw[(i*9):(i*9+9)])

    print("读取文件:"+rawdata)
    #print(list1)
    print("生成列表:")
    print(list2)
    return list2


if __name__ == "__main__":
    grid = read_data_from_file()
    print("\n原始数独数据:")
    print_list(grid)
    print("\n\n结果数独数据:")
    cal_shudu(grid, 0, 0)

 

运行的效果:

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
==================== RESTART: D:\Git\python_01\shudu6.py ====================
读取文件:615730000392480000704216953900002317150897426267341598570163842831000000426570139
生成列表:
[[6, 1, 5, 7, 3, 0, 0, 0, 0], [3, 9, 2, 4, 8, 0, 0, 0, 0], 
[7, 0, 4, 2, 1, 6, 9, 5, 3], [9, 0, 0, 0, 0, 2, 3, 1, 7],
 [1, 5, 0, 8, 9, 7, 4, 2, 6], [2, 6, 7, 3, 4, 1, 5, 9, 8], 
[5, 7, 0, 1, 6, 3, 8, 4, 2], [8, 3, 1, 0, 0, 0, 0, 0, 0], 
[4, 2, 6, 5, 7, 0, 1, 3, 9]]

原始数独数据:

615730000
392480000
704216953
900002317
150897426
267341598
570163842
831000000
426570139


结果数独数据:

615739284
392485671
784216953
948652317
153897426
267341598
579163842
831924765
426578139

615739284
392485761
784216953
948652317
153897426
267341598
579163842
831924675
426578139
>>> 

 

数独文件 shudu.txt 内容:

615730000
392480000
704216953
900002317
150897426
267341598
570163842
831000000
426570139

 

生成的数独解法文件 shudu_result.txt :


615739284
392485671
784216953
948652317
153897426
267341598
579163842
831924765
426578139

615739284
392485761
784216953
948652317
153897426
267341598
579163842
831924675
426578139

 

实例讲解:

如下图:

 

(1)把数独数据录入到:shudu.txt 文件(如果没有新建)

(2)空白的为0,一行9个数字,共9行。

907000063
000039040
000007009
040000680
000826000
061000020
100600000
090350000
730000201


(3)运行代码,生成数独结果:

==================== RESTART: D:\Git\python_01\shudu6.py ====================
读取文件:907000063000039040000007009040000680000826000061000020100600000090350000730000201
生成列表:
[[9, 0, 7, 0, 0, 0, 0, 6, 3], [0, 0, 0, 0, 3, 9, 0, 4, 0], 
[0, 0, 0, 0, 0, 7, 0, 0, 9], [0, 4, 0, 0, 0, 0, 6, 8, 0], 
[0, 0, 0, 8, 2, 6, 0, 0, 0], [0, 6, 1, 0, 0, 0, 0, 2, 0], 
[1, 0, 0, 6, 0, 0, 0, 0, 0], [0, 9, 0, 3, 5, 0, 0, 0, 0], 
[7, 3, 0, 0, 0, 0, 2, 0, 1]]

原始数独数据:

907000063
000039040
000007009
040000680
000826000
061000020
100600000
090350000
730000201


结果数独数据:

917284563
685139742
423567819
342915687
579826134
861743925
154672398
298351476
736498251
>>> 

生成的数独文件 shudu_result.txt  结果:

917284563
685139742
423567819
342915687
579826134
861743925
154672398
298351476
736498251

 

 

如果数独有多解,会生成多个解。运行时间稍长,如果是唯一解的,一般只需要几秒的时间。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsz_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值