您的位置:首页 > 编程语言 > Python开发

算法基础之python实现枚举法中的熄灯问题

2018-03-09 16:39 459 查看
问题:对于一个5*6的按钮矩阵,每个按钮位置上都有一盏灯,当按下一个按钮时,该按钮及其周围位置(上、下、左、右)的灯都会改变一次对于一个固定的5*6的灯的初始状态,按下哪些按钮,可以使所有灯都熄灭。如下:


思路:按下第一行按钮后,对于第一行仍亮着的灯,由第二行按钮控制,以此类推,
第二行按下后,对于第二行仍亮着的灯,由第三行按钮控制,......,
第四行仍亮着的灯,由第五行按钮控制,最后判断第五行灯的亮灭状态,
若第五行全熄灭,则第一行按钮的方式正确,否则,换一种第一行按下的方式。

对于初始矩阵而言,第一行按下的方式有2^6中,需一一枚举。
其中puzzle数组代表灯的亮灭状态,1代表亮,0代表灭;而press数组则代表按钮是否按下,1代表按下,0代表不按。


import numpy as np

line=[[0]*6]*5
for i in range(5):
line[i]=input("请输入第"+str(i)+"行:").split(',')
#将line中的元素转换为整型
line[i] = list(map(int, line[i]))

puzzle=np.array(line)
zero=np.zeros(6)
#向puzzle中的最上面加入一行0
puzzle=np.insert(puzzle,0,values=zero,axis=0)
#向puzzle中的最后一列加入一列0
puzzle=np.insert(puzzle,6,values=zero,axis=1)
#向puzzle中的第0列加入一行0
puzzle=np.insert(puzzle,0,values=zero,axis=1)

b=[[0 for col in range(8)] for row in range(6)]  #  6*8  不要写反
press=np.array(b)
# 或 press=np.zeros((6,8))
def guess():
for r in range(1,5):
for c in range(1,7):
#根据press的第一行和puzzle的第一行,确定press其他行的值
pres
4000
s[r+1][c]=(puzzle[r][c]+press[r][c]+press[r-1][c]+press[r][c-1]+press[r][c+1]) % 2
#判断所计算的press能否熄灭最后一行的所有灯
for c in range(1,7):
if (press[5][c-1]+press[5][c]+press[5][c+1]+press[4][c])%2!=puzzle[5][c]:
return 0
return 1
#枚举第一行按下开关的所有可能性,有2^6个
def enumeration():
while guess()==0:
press[1][1]+=1
c=1
while(press[1][c]>1):
press[1][c]=0
c+=1
press[1][c]+=1
continue

enumeration()
print("灯的初始状态:\n",puzzle[1:6,1:7])
print("按下结果为:\n",press[1:6,1:7])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: