我正在尝试创建一种解决问题的方法,其中有一个3x4表,缺少4个角。目标是创建一个算法,用1到8的数字填充该表,其中这些数字都不能是靠近它前一个数字的单元格的1个块(例如:2不能接近1),两者都是垂直的,水平和对角线。
由于我是编程的新手,我可能做错了,我正在生成一个列表,列出了单元格中所有可能的数字位置。但是对于3x4-4网格,大概有8 ^ 8个可能的情况(从[1,2,3,4,5,6,7,8]到[8,7,6,5,4,3,2, 1])
我这样做是因为我的第一个想法是创建一个函数来测试数据,如果它符合之后的标准,不需要每次都生成数字。我正在使用pickle将数据转储到txt文件中。但文件是280mb,它冻结我的电脑几分钟然后它打印内存错误。
很抱歉,如果这没有意义,我已经开始编程了一个月。
我目前生成此列表的代码是:
for a in xrange(1,9):
for b in xrange(1, 9):
for c in xrange(1, 9):
for d in xrange(1, 9):
for e in xrange(1, 9):
for f in xrange(1, 9):
for g in xrange(1, 9):
for h in xrange(1, 9):
if a != (b and c and d and e and f and g and h) and b != (
a and c and d and e and f and g and h) and c != (
b and a and d and e and f and g and h) and d != (
b and c and a and e and f and g and h) and e != (
b and c and d and a and f and g and h) and f != (
b and c and d and e and a and g and h) and g != (
b and c and d and e and f and a and h) and h != (b and c and d and e and f and g and a):
probs.append((a, b, c, d, e,f,g,h))
答案 0 :(得分:1)
正如评论所暗示的,有更有效的内置方法来进行排列,但第一个大错误是你的唯一性检查。
在python中,(7 and 12)
只评估为12,而(7 and 12 and 9)
评估为9。
它并不意味着“将不平等应用于所有这些”。
因此,你得到相当于
如果a!= h和b!= h并且......
有很多组合,其中h
是唯一的,其他组合可以是他们想要的任何东西。你将所有这些添加到probs中,并且使用了大量的内存。
第二个问题是,据我所知,你实际上并没有检查挑战的规则。你不想存储1在2旁边的可能性,因为即使排除了唯一性检查,你仍然有8个!组合
答案 1 :(得分:0)
我无法直接回答你的问题,但我最近偶然发现了一个非常全面的使用python解决sudokus的网页:http://norvig.com/sudoku.html 你的问题,对我来说似乎有相似之处,网格,不重复的单个数字#,#position,Constraint Propagation等规则......祝你好运!