拨钟问题

解法一

全局暴力搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import itertools
initstate=[3,3,0,2,2,2,2,1,2]
update=[
[1,2,4,5],
[1,2,3],
[2,3,5,6],
[1,4,7],
[2,4,5,6,8],
[3,6,9],
[4,5,7,8],
[7,8,9],
[5,6,8,9]
]

for i in itertools.product([0,1,2,3],repeat=9):
	initstate=[3,3,0,2,2,2,2,1,2]
	for j in range(9):
		for k in update[j]:
			initstate[k-1]+=i[j]
			initstate[k-1]%=4
	if sum(initstate)==0:
		print ' '.join([' '.join(str(m+1)*i[m]) for m in range(9) if i[m]!=0])
		break
# 4 5 8 9

解法二

局部暴力搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import itertools
for i in itertools.product([0,1,2,3],repeat=3):
	initstate=[-1,3,3,0,2,2,2,2,1,2]
	op=[0]+list(i)+[0]*6
	op[4]=(4-(initstate[1]+op[1]+op[2])%4)%4
	op[5]=(4-(initstate[2]+op[1]+op[2]+op[3])%4)%4
	op[6]=(4-(initstate[3]+op[2]+op[3])%4)%4
	op[7]=(4-(initstate[4]+op[1]+op[4]+op[5])%4)%4
	op[9]=(4-(initstate[6]+op[3]+op[5]+op[6])%4)%4 
	op[8]=(4-(initstate[8]+op[5]+op[7]+op[9])%4)%4
	sum=0
	sum+=(initstate[1]+op[1]+op[2]+op[4])%4
	sum+=(initstate[2]+op[1]+op[2]+op[3]+op[5])%4
	sum+=(initstate[3]+op[2]+op[3]+op[6])%4
	sum+=(initstate[4]+op[1]+op[4]+op[5]+op[7])%4
	sum+=(initstate[5]+op[1]+op[3]+op[5]+op[7]+op[9])%4
	sum+=(initstate[6]+op[3]+op[5]+op[6]+op[9])%4
	sum+=(initstate[7]+op[4]+op[7]+op[8])%4
	sum+=(initstate[8]+op[5]+op[7]+op[8]+op[9])%4
	sum+=(initstate[9]+op[6]+op[8]+op[9])%4
	if sum==0:
		print ' '.join([' '.join(str(m)*op[m]) for m in range(10) if op[m]!=0])
		break
# 4 5 8 9

其它

函数传参传值还是引用的问题,还是需要注意的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
foo=0
bar=[0]
painting=[[0]]
paintingdict={0:[0]}
print foo,bar,painting
def guess(foo2,bar2,painting2,paintingdict2):
	foo2=1
	bar2[0]=1
	painting2[0][0]=1
	paintingdict2[0]=[1]
guess(foo,bar,painting,paintingdict)

print foo,bar,painting,paintingdict

# 输出结果:
# 0 [0] [[0]]
# 0 [1] [[1]] {0: [1]}

参考

https://blog.csdn.net/C20191618/article/details/69388416