问题描述:

在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相关推荐

  1. python编写古诗_用Python实现古诗词填字游戏(一)

    利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图: 显然,横竖交叉的位置就是两句诗共有的字.那么,问题来了,如何从众多诗文中找到有共同字的句子呢? 这里Mr. PosP ...

  2. 求解3*3方格填字游戏问题(DFS + 质数)

    继续来水一道题... 一. 实验目的 加深对求解一个3 * 3方格两两相邻为质数求解算法的理解; 通过本次试验掌握将算法转换为上机操作; 加深对深度优先搜索思想的理解,理解回溯原理即实现过程,并利用其 ...

  3. AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次

    杨净 发自 家里 量子位 报道 | 公众号 QbitAI 上周,一年一度的美国填字游戏锦标赛(ACPT)落下了帷幕,共有1300多名人员线上参与. 最终官方认定,一位Tyler Hinman的玩家夺得 ...

  4. LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态. 填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' ' 和 ...

  5. 应用JavaFX实现的填字游戏

    题目来自我们老师这次布置的一个大作业,说实话,刚开始觉得难度超纲了,毕竟javaFX我们才刚开头,基本上没讲啥,全靠自学-自己看书敲代码,学习书上案例,然后书上没有的就百度,边学边做,现学现卖,题目基 ...

  6. Java-数字三角形(回溯法)

    Java-数字三角形(回溯法) 题目描述: 上图给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和. 路径上的每一 ...

  7. opencv3+python3.5成语填字游戏(三)成语填字游戏解密算法

    本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏. 源代码:https://github.com/mayue801/crossword-puzzle--idiom 1.找到横 ...

  8. [2022.1.13]UPC-2021级新生个人训练赛第22场-9782 Problem G 填字游戏

    问题 G: 填字游戏 时间限制: 1.000 Sec 内存限制: 128 M 题目描述 六一儿童节就要到了,晨晨的学校进行游园活动,其中一个游戏为填字游戏,规则为:有一个R行C列的棋盘(2≤R,C≤2 ...

  9. 最强大脑----“汉字女英雄”填字游戏研究

    最强大脑----"汉字女英雄"填字游戏研究 一.引子 江苏卫视的<最强大脑>2014年1月17日星期五第三期第一个节目,是"汉字女英雄"胡小玲所表演 ...

最新文章

  1. 如何安装新linux内核,详解Debian系统中安装Linux新内核的流程
  2. 全自动STC下载电路设计
  3. 《Effective C++》item25:考虑写出一个不抛异常的swap函数
  4. PowerToys插件扩展(类似Alfred)
  5. Android Studio使用说明
  6. 计算机机房t4,机房等级-T2-T3-T4-如何划分
  7. 【Luogu1908】逆序对(离散化,树状数组求逆序对)
  8. mvc crud_Spring MVC Hibernate MySQL集成CRUD示例教程
  9. UIButton常用属性
  10. matlab正反馈系统根轨迹,正反馈回路和非最小相位系统根轨迹
  11. 任天堂Switch蓝牙发射器方案
  12. OSChina 周六乱弹 —— 给你看个小仙女
  13. 用PuTTY 访问远程主机
  14. 高中数学联赛不等式专题:题目1
  15. 图数据库实操:用 Nebula Graph 破解成语版 Wordle 谜底
  16. CTF 2017强网杯
  17. centos7 kubernetes
  18. CedarX中代码技术的应用借鉴 (二)多态的方式创建格式解析器
  19. linux cp目录到指定目录,linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹...
  20. 过来人看PMP证书:究竟含金量有多高?

热门文章

  1. keyshot渲染玻璃打光_KeyShot渲染灯光技巧,教你如何调整灯光位置和反射
  2. 利用Javascript来创建Ubuntu Scope
  3. 4.标准体重: 男士体重=身高-100±3 女士体重=身高-110±3 输入性别、身高、体重,查看体重是否标准...
  4. 机器视觉及其应用发展
  5. MySQL中包含外键无法删除数据的解决方案
  6. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。
  7. STM32开发(1)----stm32f103c6t6开发板介绍和环境搭建
  8. 认证CCRC信息安全服务资质对企业有什么好处
  9. Process On 免费在线作图工具
  10. 阿里云安装宝塔面板步骤和流程全方位总结