填字游戏-回溯法-Python
问题描述:
在3*3个方格的方阵中要填入数字1到N(N>=10)内的某9个数字,每个方格填一个整数,使得所有相邻两个方格内的两个整数之和为质数。试求出所有满足这个要求的各种数字填法。
Python实现:
# bl[i]来记录数字i是否使用过,
# di[i]用来记录下一个可以插在数字i后面的与其和为质数的数字在pr[i][]中的位置。
# 用pr[i][j]来存储按数字从小到大的顺序得出的与数字i和为质数的第j个数字,
# 例如:pr[1][2]存储的是与数字1的和为质数的第二个数字,我们可以通过查询
# 数组pr[][]的第一行找出第二个不为 0 值,然后将当前数组单元的列号存储到pr[1][2]中,即pr[1][2] = 4。
# 算法思想是通过查询二维数组pr[][],来确定下一个可以插入数组num[]的未使用过的数字,并记录该数字位于数组pr[][]的位置,
# 以便回溯时寻找下一个符合要求的数字。如果不存在这样的未使用的数字,则需要回溯到上一个已插入num[]的数字,
# 寻找下一个可以插在该数字后面的未使用过的数字进行插入,如果所有的数字都已经插入到num[]中,计数器 number++
# 进行回溯,重复上述操作,寻找其他符合要求的序列。
# 这里面有一个关键在于处理位于num数组右下角四个格子的数时,不光需要判断与前一个数i的关系,还需要判断其头顶上的元素 j 之和是否为素数。
# i,j 代表着,已经入栈的数字,在即将扩展的位置,a,b 的左边或者上边。import mathdef isPrime(n): # 判断是否为质数t = int(math.sqrt(n)) + 1 # 开平方,上取整for k in range(2, t+1):if not(n % k): return Falsereturn Truedef numberPlace(n):n = n + 1 # 包含第 n 个数字number = 0pr = [[0] * n for _ in range(n)]bl = [0] * n # 判断 下标 i 是否已经使用过, 0 未使用过,1 使用过di = [1] * n # 记录当前数值可结合的数值(用于回溯)相当于迷宫问题中的方向,1表示可使用,0表示不可使用num = [[0] * 3 for _ in range(3)]for i in range(1, n): # pr 记录 i 和那些数字结合可以是一个质数k = 1for j in range(1, n):if i != j and int(math.fabs(i-j)) % 2 != 0:if isPrime(i+j):pr[i][k] = jk += 1for i in range(1, n):num[0][0], bl[i], k = i, 1, 1 # 第一个元素进入方格,数字 i, 已经使用过a, b = int(k / 3), k % 3 # 下一个位置while k: # 表示栈指针while k < 9 and pr[i][di[i]]: # 当前结点,还存在可以扩展的数字if not bl[pr[i][di[i]]]: # 可扩展的数字没有被使用过if a == 0 or b == 0 or isPrime(j+pr[i][di[i]]):num[a][b] = pr[i][di[i]] # 相当于进栈bl[num[a][b]] = 1 # 已经使用过di[i] += 1 # 相当于前一个数字,扩展到了下一个if b == 2: # 说明在最后一列上,那么下一个可扩展的数子,在同一行第一个数字的下面i = num[a][0]elif a != 0: # num数组右下角四个格子的数i, j = num[a][b], num[a-1][b+1]else:i = num[a][b]k += 1a, b = int(k / 3), k % 3 # 下一个位置else: di[i] += 1else: di[i] += 1if k == 9: # 9个数字都全部填好number += 1# ----- 类似于 出栈 过程k -= 1a, b = int(k / 3), k % 3 # 获取行列 ,并恢复环境bl[num[a][b]], di[num[a][b]] = 0, 1if a == 0 and b == 0: # 第一个数字i = num[0][0]elif a == 0: # 第一行的数字i = num[a][b-1]elif b == 0: # 第一列的数字i = num[a-1][0]else: # num数组右下角四个格子的数i, j = num[a][b-1], num[a-1][b]return numberif __name__ == '__main__':print(numberPlace(20))
发现问题,请留言指教哦
填字游戏-回溯法-Python相关推荐
- python编写古诗_用Python实现古诗词填字游戏(一)
利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图: 显然,横竖交叉的位置就是两句诗共有的字.那么,问题来了,如何从众多诗文中找到有共同字的句子呢? 这里Mr. PosP ...
- 求解3*3方格填字游戏问题(DFS + 质数)
继续来水一道题... 一. 实验目的 加深对求解一个3 * 3方格两两相邻为质数求解算法的理解; 通过本次试验掌握将算法转换为上机操作; 加深对深度优先搜索思想的理解,理解回溯原理即实现过程,并利用其 ...
- AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次
杨净 发自 家里 量子位 报道 | 公众号 QbitAI 上周,一年一度的美国填字游戏锦标赛(ACPT)落下了帷幕,共有1300多名人员线上参与. 最终官方认定,一位Tyler Hinman的玩家夺得 ...
- LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态. 填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' ' 和 ...
- 应用JavaFX实现的填字游戏
题目来自我们老师这次布置的一个大作业,说实话,刚开始觉得难度超纲了,毕竟javaFX我们才刚开头,基本上没讲啥,全靠自学-自己看书敲代码,学习书上案例,然后书上没有的就百度,边学边做,现学现卖,题目基 ...
- Java-数字三角形(回溯法)
Java-数字三角形(回溯法) 题目描述: 上图给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和. 路径上的每一 ...
- opencv3+python3.5成语填字游戏(三)成语填字游戏解密算法
本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏. 源代码:https://github.com/mayue801/crossword-puzzle--idiom 1.找到横 ...
- [2022.1.13]UPC-2021级新生个人训练赛第22场-9782 Problem G 填字游戏
问题 G: 填字游戏 时间限制: 1.000 Sec 内存限制: 128 M 题目描述 六一儿童节就要到了,晨晨的学校进行游园活动,其中一个游戏为填字游戏,规则为:有一个R行C列的棋盘(2≤R,C≤2 ...
- 最强大脑----“汉字女英雄”填字游戏研究
最强大脑----"汉字女英雄"填字游戏研究 一.引子 江苏卫视的<最强大脑>2014年1月17日星期五第三期第一个节目,是"汉字女英雄"胡小玲所表演 ...
最新文章
- 如何安装新linux内核,详解Debian系统中安装Linux新内核的流程
- 全自动STC下载电路设计
- 《Effective C++》item25:考虑写出一个不抛异常的swap函数
- PowerToys插件扩展(类似Alfred)
- Android Studio使用说明
- 计算机机房t4,机房等级-T2-T3-T4-如何划分
- 【Luogu1908】逆序对(离散化,树状数组求逆序对)
- mvc crud_Spring MVC Hibernate MySQL集成CRUD示例教程
- UIButton常用属性
- matlab正反馈系统根轨迹,正反馈回路和非最小相位系统根轨迹
- 任天堂Switch蓝牙发射器方案
- OSChina 周六乱弹 —— 给你看个小仙女
- 用PuTTY 访问远程主机
- 高中数学联赛不等式专题:题目1
- 图数据库实操:用 Nebula Graph 破解成语版 Wordle 谜底
- CTF 2017强网杯
- centos7 kubernetes
- CedarX中代码技术的应用借鉴 (二)多态的方式创建格式解析器
- linux cp目录到指定目录,linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹...
- 过来人看PMP证书:究竟含金量有多高?
热门文章
- keyshot渲染玻璃打光_KeyShot渲染灯光技巧,教你如何调整灯光位置和反射
- 利用Javascript来创建Ubuntu Scope
- 4.标准体重: 男士体重=身高-100±3 女士体重=身高-110±3 输入性别、身高、体重,查看体重是否标准...
- 机器视觉及其应用发展
- MySQL中包含外键无法删除数据的解决方案
- 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。
- STM32开发(1)----stm32f103c6t6开发板介绍和环境搭建
- 认证CCRC信息安全服务资质对企业有什么好处
- Process On 免费在线作图工具
- 阿里云安装宝塔面板步骤和流程全方位总结