最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python解決計數(shù)原理問題的方法

 更新時間:2016年08月04日 15:10:07   投稿:daisy  
計數(shù)原理是數(shù)學(xué)中的重要研究對象之一,分類加法計數(shù)原理、分步乘法計數(shù)原理是解決計數(shù)問題的最基本、最重要的方法,也稱為基本計數(shù)原理,它們?yōu)榻鉀Q很多實際問題提供了思想和工具。本文教大家怎么用Python解決在數(shù)學(xué)中遇到的計數(shù)原理問題。

前幾天遇到這樣一道數(shù)學(xué)題:

用四種不同顏色給三棱柱六個頂點涂色,要求每個點涂一種顏色,且每條棱的兩個端點涂不同顏色,則不同的涂色方法有多少種?

當我看完題目后,頓時不知所措。于是我拿起草稿紙在一旁漫無目的地演算了一下,企圖能找到解決方法。結(jié)果一無所獲。于是打算通過程序算法解決這個問題。經(jīng)過2個多小時的研究,終于完成了代碼,并求得了答案。

由于Python寫起來比較方便而且本人比較喜歡Python的語法,所以研究算法時我通常采用Python,此次也不例外。以下就是整個算法的實現(xiàn)過程。

兩種算法

我一共想出了兩種用于解決本題的算法:

    算法一:將所有的涂色情況通過程序的循環(huán)計算出來,然后通過程序的條件判斷去除掉不合題意的所有情況,最后得到最終結(jié)果。

    算法二:從其中任意一個端點(p0)入手,由于其它所有端點都沒有涂色,所以它可以涂四種顏色。將這四種顏色通過循環(huán)分別涂在這個端點上,每涂上一種顏色后,獲取與它相臨的一個端點(p1),并獲取它可以涂上的顏色,然后通過循環(huán)將可用顏色涂上(及不能涂上與p0相同的顏色),每涂上一種顏色,又將p1相鄰的未涂色的點涂色(及除p0外其他的相鄰端點)。每個點被涂色后都采用同樣的方法將相鄰的點涂色,以此類推,涂完最后一個點,就記一次情況。所有的遞歸都完成后,就獲得了所有情況。

算法一很直接很粗暴,所以我采用了算法二來解決上述問題。接下來就是具體的代碼了。

算法實現(xiàn)

我寫了大約90行Python代碼來實現(xiàn)這個算法:

colorList = [0, 1, 2, 3]
pointList = []
amount = 0


class Point(object):
  def __init__(self):
    super(Point, self).__init__()

    self.neibors = []
    self.color = None

  def paint(self, c):
    self.color = c

  def clean(self):
    self.color = None

  def getLeftOverColors(self):
    copyOfColorList = colorList[0 : 4]

    for neibor in self.neibors:
      nc = neibor.color

      if nc in copyOfColorList:
        copyOfColorList.remove(nc)

    return copyOfColorList


def main():
  global pointList

  p0 = Point()
  p1 = Point()
  p2 = Point()
  p3 = Point()
  p4 = Point()
  p5 = Point()

  p0.neibors = [p1, p2, p4]
  p1.neibors = [p0, p2, p5]
  p2.neibors = [p0, p1, p3]
  p3.neibors = [p2, p4, p5]
  p4.neibors = [p0, p3, p5]
  p5.neibors = [p4, p3, p1]

  pointList = [p0, p1, p2, p3, p4, p5]

  paintPoint(p0)

  print(amount)

def paintPoint(p):
  global amount

  colors = p.getLeftOverColors()
  lastOne = isLastOne()

  for c in colors:
    p.paint(c)

    if lastOne:
      amount += 1
    else:
      for currentNeibor in p.neibors:
        if currentNeibor.color == None:
          paintPoint(currentNeibor)

          break

  p.clean()

def isLastOne():
  global pointList

  paintedNum = 0

  for p in pointList:
    if p.color != None:
      paintedNum += 1

  return paintedNum == 5


if __name__ == "__main__":
  main() 

以下是對各段代碼的介紹。

全局變量

    colorList:顏色列表

    pointList:存放六個點的列表

    amount : 涂色方案的種數(shù)

Point類

用于儲存各個點的信息,如點的顏色(color屬性,None代表無顏色)、相鄰的點('neibors'屬性)。以及提供paint方法用于將點標記顏色;clean方法用于去除顏色;getLeftOverColors方法用于獲取可用顏色,及獲取相鄰點沒有使用的顏色。

main函數(shù)

程序開始運行時調(diào)用的函數(shù),其中構(gòu)造了所需的六個點,以及分別為這六個點明確了相鄰的三個點。注意,由于這里的點只有相鄰和不相鄰的位置關(guān)系,所以不需要在意這些點到底在三棱柱里對應(yīng)哪個位置,任意設(shè)定這些點的位置對結(jié)果來說并沒有影響,只需注意它們之間的相鄰關(guān)系即可。

isLastOne函數(shù)

判斷是不是最后一個未涂色的點。

paintPoint函數(shù)

用于對作為參數(shù)傳入的點進行著色。其中首先通過調(diào)用該點的getLeftOverColors方法獲取可用顏色,然后按照上文算法中介紹的,通過遍歷可用顏色列表,為該點著色,如果該點不是最后一個點(通過isLastOne函數(shù)判斷),就遞歸調(diào)用paintPoint函數(shù)為相鄰的一個未著色的點著色,如果是,則將記下一次涂色方案。

運行代碼,得到結(jié)果 - 264:

Ok,于是這道題就在我們的計算機的幫助下,被成功解決掉了~如果大家有更好的方案解決這一算法問題,歡迎留言進行交流~希望本文對大家學(xué)習(xí)Python和計數(shù)原理都能有所幫助。

相關(guān)文章

  • PyCharm自動化測試的實現(xiàn)

    PyCharm自動化測試的實現(xiàn)

    本文主要介紹了PyCharm自動化測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Xadmin+rules實現(xiàn)多選行權(quán)限方式(級聯(lián)效果)

    Xadmin+rules實現(xiàn)多選行權(quán)限方式(級聯(lián)效果)

    這篇文章主要介紹了Xadmin+rules實現(xiàn)多選行權(quán)限方式(級聯(lián)效果),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 國產(chǎn)麒麟系統(tǒng)kylin部署python項目詳細步驟

    國產(chǎn)麒麟系統(tǒng)kylin部署python項目詳細步驟

    這篇文章主要給大家介紹了關(guān)于國產(chǎn)麒麟系統(tǒng)kylin部署python項目的相關(guān)資料,文中通過代碼示例介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • pyqt qlistwidget改變item顏色的操作

    pyqt qlistwidget改變item顏色的操作

    這篇文章主要介紹了pyqt qlistwidget改變item顏色的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python如何實現(xiàn)多層級自動賦值字典

    python如何實現(xiàn)多層級自動賦值字典

    這篇文章主要介紹了python如何實現(xiàn)多層級自動賦值字典問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python實現(xiàn)從常規(guī)文檔中提取圖片的方法詳解

    Python實現(xiàn)從常規(guī)文檔中提取圖片的方法詳解

    這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)從常規(guī)文檔(Word,PDF,Excel,HTML)中提取圖片的方法,有需要的小伙伴可以參考一下
    2025-03-03
  • Django基于Models定制Admin后臺實現(xiàn)過程解析

    Django基于Models定制Admin后臺實現(xiàn)過程解析

    這篇文章主要介紹了Django基于Models定制Admin后臺實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Android Q之氣泡彈窗的實現(xiàn)示例

    Android Q之氣泡彈窗的實現(xiàn)示例

    這篇文章主要介紹了Android Q之氣泡彈窗的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python之Matlibplot畫圖功能演示過程

    Python之Matlibplot畫圖功能演示過程

    這篇文章主要介紹了Python之Matlibplot畫圖功能演示過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python 數(shù)據(jù)的清理行為實例詳解

    python 數(shù)據(jù)的清理行為實例詳解

    這篇文章主要介紹了python 數(shù)據(jù)的清理行為實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

炉霍县| 巧家县| 栾川县| 彭山县| 工布江达县| 自贡市| 密山市| 松阳县| 大城县| 沅江市| 沁水县| 连南| 佛教| 侯马市| 博爱县| 晋江市| 彝良县| 安西县| 忻州市| 慈溪市| 谢通门县| 清镇市| 阜南县| 资源县| 西安市| 万山特区| 镇沅| 肇东市| 呼玛县| 潞西市| 天镇县| 扎鲁特旗| 聂荣县| 江孜县| 吴川市| 沂南县| 九寨沟县| 师宗县| 随州市| 郑州市| 东兰县|