python暴力求解成语填字游戏
问题
思路
首先从网上获得所有成语数据,整理清洗为一个标准的txt文档,然后用python读入为一个列表。
然后按照花字在成语的位置将其分类为4类,即4个列表。
主循环里,把4类成语里带花的成语按照列向量满足条件依次放好,即先满足列上的要求。每按照列向量放好一组4个成语,判断横向的四个四字短语是否是对应花字位置的成语,如果4行都满足则当前列向量的摆法就是结果,将其输出,否则继续遍历。
成语数据获取
百度搜索“成语 txt”,得到相关txt,包含30000+中国成语,但里面还有成语解释等内容,使用python预处理为整齐的仅含成语列表的txt。
代码
with open('idiom.txt', 'r', encoding='utf-8') as i:
a = i.readlines()
# a是原始所有成语
b = []
for t in a:
b.append(t.replace('\n', ''))
# b是除去换行符的成语
for t in b:
if len(t) != 4:
b.pop(b.index(t))
# 从b中剔除非4字成语
h1, h2, h3, h4 = [], [], [], []
for t in b:
if t[0:1] == '花':
h1.append(t)
elif t[1:2] == '花':
h2.append(t)
elif t[2:3] == '花':
h3.append(t)
elif t[3:4] == '花':
h4.append(t)
else:
pass
# h1,h2,h3,h4分别为花所在位置的成语列表
board = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] # 四个列向量
for t1 in h1:
# 放第一列
for tt1 in range(4):
board[0][tt1] = t1[tt1:tt1+1]
# 放第二列
for t2 in h2:
for tt2 in range(4):
board[1][tt2] = t2[tt2:tt2+1]
# 放第三列
for t3 in h3:
for tt3 in range(4):
board[2][tt3] = t3[tt3:tt3+1]
# 放第四列
for t4 in h4:
for tt4 in range(4):
board[3][tt4] = t4[tt4:tt4+1]
l1 = board[0][0]+board[1][0]+board[2][0]+board[3][0]
l2 = board[0][1]+board[1][1]+board[2][1]+board[3][1]
l3 = board[0][2]+board[1][2]+board[2][2]+board[3][2]
l4 = board[0][3]+board[1][3]+board[2][3]+board[3][3]
if l1 in h1 and l2 in h2 and l3 in h3 and l4 in h4:
print(l1, l2, l3, l4)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。