cambaluc的个人博客分享 http://blog.sciencenet.cn/u/cambaluc

博文

用Python做一个小学奥数题

已有 3767 次阅读 2020-6-29 16:25 |个人分类:Python|系统分类:教学心得| 奥数选择, python, python

题目:如图,在3x3的方格中,移动规则如下:每行均可左右移动,每列均可上下移动,每次仅能对某一行或某一列进行移动,其他行或列不变化。例如[1,2,3]向右移动一次为[3,1,2][1,2,3]’向上移动一次为[2,3,1]’。若想移动成每行的数字相同,则最少需要移动(  )次。

A.2  B.3  C.4   D.5

image.png

   分析:一遇到这种题就傻,想半天想不出。只能分析出111222333放入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 对应第4321步移动,即C3vR3>C2vR1<。如图所示的变化步骤

image.png

原题是如下图,可试着不用程序做一做,答案是B,3步。

image.png



https://wap.sciencenet.cn/blog-797552-1239883.html

上一篇:胡同的石榴树
下一篇:线性代数(5)C语言找逆矩阵、特征值是整数的简单矩阵
收藏 IP: 124.64.19.*| 热度|

1 李毅伟

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 06:13

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部