[Python3]数独计算器
学习 Python 之后发现似乎比 C 更容易掌握,于是也自己尝试写了一个小程序:
import sys
fo = open("sudoku_data.txt")
sudoku = [0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in range(0,9):sudoku[i] = list(map(int, fo.readline().replace('\n', '')))
fo.close()
def canfill(i, j, k, sudoku): '''当前行 列 填入的数字 数独'''for m in range(0, 9):if (sudoku[i][m] == k or sudoku[m][j] == k or sudoku[i // 3 * 3 + m // 3][j // 3 * 3 + m % 3] == k):return Falsereturn True
def solve(i, j, sudoku):if (i == 9):result = open("sudoku_result.txt",'w')for k in range(0, 9):for m in range(0, 9):result.write(str(sudoku[k][m]))result.write('\n')result.close()sys.exit()if (sudoku[i][j] != 0):solve(i if j < 8 else i + 1, (j + 1) % 9, sudoku) for k in range(1, 10):if (canfill(i, j, k, sudoku)):sudoku[i][j] = ksolve(i if j < 8 else i + 1, (j + 1) % 9, sudoku) sudoku[i][j] = 0 #如果下一个数填写失败就让当前所填成功的数为0以避开上一个if的条件,进行下一个k的尝试
solve(0, 0, sudoku)
功能
在data中写入数独,然后运行程序,填写完毕的数独会在result中输出出来
递归
函数调用本身,从而实现回溯,尝试填入下一个k,最终解出答案。
if (sudoku[i][j] != 0):solve(i if j < 8 else i + 1, (j + 1) % 9, sudoku) for k in range(1, 10):if (canfill(i, j, k, sudoku)):sudoku[i][j] = ksolve(i if j < 8 else i + 1, (j + 1) % 9, sudoku) sudoku[i][j] = 0
首先判断是否不为0,即区别空与已知条件。
从1到9的循环中尝试填入,满足条件可以调用自身进行下一个判断,如果1-9都不满足,就跳回上一层尝试。
由于结束程序时退出递归很麻烦,于是借用sys.exit()
来强制退出。
三目运算
Python 中没有像 C 语言中一样直接使用 x ? a : b 这样的三元表达式,程序中的
solve(i if j < 8 else i + 1, (j + 1) % 9, sudoku)
其实等价于:
if (j < 8):solve(i, (j + 1) % 9, sudoku)
else:solve(i + 1, (j + 1) % 9, sudoku)
意思就是填写右边一个格子,如果已经是最右边,就令行数+1,列变为(8 + 1) % 9 = 0,从下一行第一个格子开始填写。
判断函数
def canfill(i, j, k, sudoku): '''当前行 列 填入的数字 数独'''for m in range(0, 9):if (sudoku[i][m] == k or sudoku[m][j] == k or sudoku[i // 3 * 3 + m // 3][j // 3 * 3 + m % 3] == k):return Falsereturn True
前面的sudoku[i][m] == k or sudoku[m][j] == k
很容易理解,之后是对于宫内数字是否重复的判断。
i // 3 * 3返回的结果是0, 3, 6,即每一宫的开始行,之后的j也同理。
m // 3 与 m % 3 可以让 m 在 0 - 8 的逐一遍历中返回
0 0
0 1
0 2
1 0
1 1
…
这样相加就可以表示出行列。
[Python3]数独计算器相关推荐
- 用vb编了个数独计算器
平时很喜欢玩数独游戏,每天只要信报上有数独游戏,那就不看别的了,专心致志玩一路. 昨天突然想自己编一个软件来算吧,于是就有了这篇文章和一个vb的数独计算器. 下载地址: http://download ...
- python3 数独
数独 最近在网上看到数独,感觉非常有意思,所以就来实现以下. 一个数独题的网站(https://www.oubk.com/DailySudoku/17778/1),偷懒直接爬虫抓下来了,哈哈 代码实现 ...
- python tkinter计算器实例_利用Tkinter(python3.6)实现一个简单计算器
前言 上机实践课程开始了,嗯,老师来了之后念了下PPT,然后说:开始做吧......... 然后就开始了Python的GUI之路,以前没接触过PYthon的可视化界面(虽然这样很不明智) 但是现在做起 ...
- 数独游戏-C语言实现
数独游戏-C语言实现 目标 写一个数独游戏,有以下功能: 1:能随机产生题目并给出答案. 2:求解输入的题目并输出答案. 实现说明 参照百度百科等资料可以知道求解数独的主要算法是:1.通过行.列和宫格 ...
- java编程计算器程序代码_34 个送给 Java 程序员的练手项目合集
人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码,才能真正学会「编程」.太多人看完一本书.几个 G 的视频后 ...
- python编写一个简单计算器_如何用Tkinter写个简单计算器
上机实践课程开始了,嗯,老师来了之后念了下PPT,然后说:开始做吧......... 然后就开始了Python的GUI之路,以前没接触过PYthon的可视化界面(虽然这样很不明智) 但是现在做起来感觉 ...
- python tkinter计算器实例_可能是最有颜值的Python Tkinter计算器
上机实践课程开始了,嗯,老师来了之后念了下PPT,然后说:开始做吧......... 然后就开始了Python的GUI之路,以前没接触过PYthon的可视化界面(虽然这样很不明智) 但是现在做起来感觉 ...
- 【趣味数学】数独 Sudoku
在线数独计算器:https://shudu.gwalker.cn/ 数独(shù dú)是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出 ...
- 数独游戏-很久之前做的,现在整理一下
题目: 写一个数独游戏,有以下功能: 1:能随机产生题目并给出答案. 2:求解输入的题目并输出答案. 实验说明: 参照百度百科等资料可以知道求解数独的主要算法是:1.通过行.列和宫格确定可填数字.2. ...
最新文章
- idea开发swing项目_IntelliJ IDEA 开发swing(一)
- 如何得到长整数逆序后的整数
- Tensorflow入门神经网络代码框架
- python多级字典_Python多层字典取值
- 我拿模型当朋友,模型却想泄漏我的隐私?
- c语言位运算符的使用_C语言程序使用位运算符检查给定数字是否为回文
- 通过Python扫描代码关键字并进行预警
- “一休数学思维”改名“海豚思维”,并完成数千万元Pre-A轮融资
- 朝鲜欲对韩国发起大规模网络攻击 但计划被韩方挫败
- 计算机网络 | 无盘工作站的建立
- 拉登是我罩的队_软件需求规格说明书
- 信息安全工程师考试科目
- 常见概率抽样方法及其适用场景总结
- 快速判断工作簿中是否存在指定工作表
- 海南旅游自由行攻略怎么玩
- [情感] 纯情女生给老实木讷男孩的恋爱建议
- matlab simulink入门:搭建一个简单的电路
- 区块链运作机制_区块链如何运作? 铂 4
- 合并的表格怎么加横线_word
- 电商派争夺零售派:传统百货扎堆试水O2O
热门文章
- 图像分类——猫狗大战问题
- Google Earth Engine(GEE)下载全球土壤砂粒(Sand)含量数据
- 基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现
- VMware虚拟机ping不通主机,Destination Host Unreachable
- IDF实验室-抓到一只苍蝇
- E: dpkg was interrupted, you must manually run ‘dpkg –configure -a’ to correct the problem. 解决办法
- Zabbix监控之监控项
- 美国大学计算机牛校简介
- 人体解析任务 和 Look into Person数据集 (附源码分享)
- php安全新闻早八点-高级持续渗透-第一季关于后门