快好知 kuaihz

用Python做一个小学奥数题

题目:如图,在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步。

本站资源来自互联网,仅供学习,如有侵权,请通知删除,敬请谅解!
搜索建议:奥数  奥数词条  小学  小学词条  Python  Python词条  一个  一个词条  
观点

 科学与想象对立吗?

科学与想象对立吗?■武夷山(发表于2021年6月17日《中国科学报》)2019年12月,英国牛津大学出版社出版了以色列耶路撒冷希伯来大学的科学哲学家Arnon ...(展开)