分享

算法创作|纸牌三角形

 算法与编程之美 2021-04-02

问题描述

A,2,3,4,5,6,7,8,9 9张纸牌排成一个正三角形(A1计算)。要求每个边的和相等。

下图就是一种排法(如有对齐问题,参看p1.png)。

     A

    9 6

   4   8

   37 5 2

这样的排法可能会有很多。

如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

笨笨有话说:

  感觉可以暴力破解哦。

  麻烦的是,对每个排法还要算出它的旋转、镜像排法,看看有没有和历史重复。

歪歪有话说:

   人家又不让你把所有情况都打印出来,只是要算种类数。

    对于每个基本局面,通过旋转、镜像能造出来的新局面数目不是固定的吗?

解决方案

通过对于本题,比较重要的一点是对所给数据做一个全排列,如何做到全排列,就要用到itertools,一个用于高效循环的迭代器,但是本题只是涉及一个简单的应用,所以就只是简单的学习该迭代器的一小部分知识,更多的做不到,该题所用到的的是permutations()的使用,该操作会得出所有可能的排序,没有重复的元素。之后是用if条件判断提前做出下标标记的所有数字是否满足等边三角形的相应知识,因为旋转得到情况3种,镜像有2种,所以得出结果后除以6就可以得到最终答案。

import itertools

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

res = 0

for i in itertools.permutations(a, 9):#遍历列表a,itertools得出全排列结果

     w = list(i)

     if w[0]+w[1]+w[2]+w[3] == w[3]+w[4]+w[5]+w[6] == w[6]+w[7]+w[8]+w[0]:

         res += 1

print('%d' % (res/6)) 

#iterator 循环器,itertools.permutations就是返回可迭代对象的所有数学全排列方式。

结语

解决一道蓝桥杯的真题,同时学到了一点新的知识,迭代器的一个方法的使用,虽然题目看似难度不大,还是要有缜密的思维思考方式,今后的会不断加强思维能力,做出更多的题目。

主编:欧洋

作者:涂瀚鑫、沈志坚、陈东

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多