题目:如图,在3x3的方格中,移动规则如下:每行均可左右移动,每列均可上下移动,每次仅能对某一行或某一列进行移动,其他行或列不变化。例如[1,2,3]向右移动一次为[3,1,2],[1,2,3]’向上移动一次为[2,3,1]’。若想移动成每行的数字相同,则最少需要移动( )次。
A.2 B.3 C.4 D.5
分析:一遇到这种题就傻,想半天想不出。只能分析出1、1、1,2、2、2,3、3、3放入9个格子中有C(9,3)乘C(6,3)等于1680个可能状态。移动一步,即按行左右移及按列上下移的方式共有12种。不知能建立什么模型处理计算,甚至想到了用树或图,即用结点表示状态,用边表示移动,一个结点最多有12条边,但还是理不清思路。只好用穷举,惯用的伎俩。以下是python程序:函数move表示移动一步的12种可能,以下穷举了四步,得到这个题的答案,最后图片的题有3步即可。程序的最后一行是反推出这四步中每步按那个方式(12种之一)移动的。
S=[]
X1=[]
X2=[]
X3=[]
X4=[]
def move(F):
##以下每行对应一次移动时的12种可能移法,<左移,>右,^上,v下。
##[ 0 1 2 3 4 5 6 7 8 9 10 11]
##[R1<,r1>,R2<,r2>,R3<,r3>,C1^,C1v,C2^,C2v,C3^,C3v]
S.append([[F[0][1],F[0][2],F[0][0]], [F[1][0],F[1][1],F[1][2]],[F[2][0],F[2][1],F[2][2]]])
S.append([[F[0][2],F[0][0],F[0][1]], [F[1][0],F[1][1],F[1][2]],[F[2][0],F[2][1],F[2][2]]])
S.append([[F[0][0],F[0][1],F[0][2]], [F[1][1],F[1][2],F[1][0]],[F[2][0],F[2][1],F[2][2]]])
S.append([[F[0][0],F[0][1],F[0][2]], [F[1][2],F[1][0],F[1][1]],[F[2][0],F[2][1],F[2][2]]])
S.append([[F[0][0],F[0][1],F[0][2]], [F[1][0],F[1][1],F[1][2]],[F[2][1],F[2][2],F[2][0]]])
S.append([[F[0][0],F[0][1],F[0][2]], [F[1][0],F[1][1],F[1][2]],[F[2][2],F[2][0],F[2][1]]])
S.append([[F[1][0],F[0][1],F[0][2]], [F[2][0],F[1][1],F[1][2]],[F[0][0],F[2][1],F[2][2]]])
S.append([[F[2][0],F[0][1],F[0][2]], [F[0][0],F[1][1],F[1][2]],[F[1][0],F[2][1],F[2][2]]])
S.append([[F[0][0],F[1][1],F[0][2]], [F[1][0],F[2][1],F[1][2]],[F[2][0],F[0][1],F[2][2]]])
S.append([[F[0][0],F[2][1],F[0][2]], [F[1][0],F[0][1],F[1][2]],[F[2][0],F[1][1],F[2][2]]])
S.append([[F[0][0],F[0][1],F[1][2]], [F[1][0],F[1][1],F[2][2]],[F[2][0],F[2][1],F[0][2]]])
S.append([[F[0][0],F[0][1],F[2][2]], [F[1][0],F[1][1],F[0][2]],[F[2][0],F[2][1],F[1][2]]])
X0=[[2,1,2],[2,1,3],[3,1,3]]
move(X0)
for i in S:
X1.append(i)
S=[]
for i in X1:
move(i)
for i in S:
X2.append(i)
S=[]
for i in X2:
move(i)
for i in S:
X3.append(i)
i=0
S=[]
for i in X3:
move(i)
for i in S:
X4.append(i)
i=0
for F in X4:
if (F[0][0]==F[0][1]==F[0][2] and F[1][0]==F[1][1]==F[1][2] and F[2][0]==F[2][1]==F[2][2]):
print(F[0])
print(F[1])
print(F[2])
print(i)
break
i=i+1
print(i%12,i//12%12,i//12//12%12,i//12//12//12)
运行结果:
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
1367:
11 5 9 0
>>>
说明:11、 5、 9、 0、 对应第4、3、2、1步移动,即C3v、R3>,C2v,R1<。如图所示的变化步骤
。
原题是如下图,可试着不用程序做一做,答案是B,3步。