• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            雁過無痕

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::

            N個(gè)數(shù)計(jì)算24點(diǎn)

            問題:

                N個(gè)113之間的自然數(shù),找出所有能通過加減乘除計(jì)算(每個(gè)數(shù)有且只能用一次)得到24的組合

             

            計(jì)算24點(diǎn)常用的算法有:① 任取兩個(gè)數(shù),計(jì)算后,將結(jié)果放回去,再從剩下的數(shù)中任取兩個(gè),如此反復(fù)直到只剩下一個(gè)數(shù);② 先構(gòu)建前綴/后綴表達(dá)式,再計(jì)算該表達(dá)式;③ 用集合保存中間結(jié)果,集合間兩兩進(jìn)行合并計(jì)算得到新集合(或者對給定的一個(gè)集合,對其所有的子集合進(jìn)行合并計(jì)算)。

            本文采用第一種方法。定義六種操作符:ADDSUBMULDIVRSUBRDIV,分別對應(yīng)加、減、乘、除、反減和反除(反減/除:先交換兩個(gè)數(shù),再減/除)。

            顯然,取兩個(gè)數(shù)計(jì)算時(shí),六種計(jì)算結(jié)果可能有重復(fù),可以對這6個(gè)結(jié)果進(jìn)行去重(實(shí)際上,只要分別對加減(ADDSUBRSUB)和乘除(MULDIVRDIV)的3個(gè)計(jì)算結(jié)果進(jìn)行去重判斷就可以了,效率和對6個(gè)結(jié)果去重相差不大)。

            另外一種剪枝方法:保存每個(gè)數(shù)上次計(jì)算時(shí)所用的操作符(初始值為空)。所取的兩個(gè)數(shù):

            若某個(gè)數(shù)的上次操作符為減(SUBRSUB),那么不進(jìn)行加減(ADDSUBRSUB)計(jì)算。

            若某個(gè)數(shù)的上次操作符為除(DIVRDIV),那么不進(jìn)行乘除(MULDIVRDIV)計(jì)算。

            比如:取的兩個(gè)數(shù)為 a-b c(c的上次操作符任意),如果進(jìn)行加減計(jì)算的話,

            a-b+c  c+a-b重復(fù),

            c-(a-b)c+b-a重復(fù)

            a-b-c  c+b RSUB a重復(fù)

            也就是說,上次操作符為減的,進(jìn)行加減計(jì)算時(shí),總可以轉(zhuǎn)為某個(gè)上次操作符為加的表達(dá)式,因而可以不計(jì)算。同樣,上次操作符為除的,不進(jìn)行乘除計(jì)算。

            當(dāng)然,還可以考慮記錄位置進(jìn)行剪枝,這樣避免a+b+ca+c+b都進(jìn)行計(jì)算。但要注意的是:在給定的組合無解時(shí),越多的剪枝方法,極有可能提高搜索效率,但在給定的組合有解時(shí),很可能反而降低搜索效率

            另外,對有解時(shí)輸出的表達(dá)式的處理對程序的性能影響很大。如果每次計(jì)算都保存對應(yīng)的表達(dá)式,會進(jìn)行大量的字符串操作,嚴(yán)重影響性能。實(shí)際上,每次計(jì)算只要保存取出的兩個(gè)數(shù)的位置和所進(jìn)行計(jì)算的操作符就夠了,最終需要輸出表達(dá)式時(shí),只要模擬一下遞歸函數(shù)調(diào)用過程,進(jìn)行相應(yīng)的字符串操作。

            下面是程序(gcc 4.5,優(yōu)化參數(shù)-O2)在T4200/2G單核下運(yùn)行的結(jié)果,計(jì)算10個(gè)數(shù),646646個(gè)組合只用了不到13分鐘。


             
            N個(gè)113之間的數(shù)的所有組合,計(jì)算24點(diǎn)

            N

            4

            5

            6

            7

            8

            9

            10

            時(shí)間(ms)

            78

            610

            4157

            19593

            160922

            173766

            764328

            有解組合數(shù)

            1362

            6104

            18554

            50386

            125969

            293930

            646646

            總組合

            1820

            6188

            18564

            50388

            125970

            293930

            646646

            總表達(dá)式

            1124776

            15656645

            105278906

            492587616

            3760744504

            4535030813

            19912345238

            表達(dá)式A

            457549

            11864184

            88679768

            409129896

            1173803224

            4535030813

            19912345238

            表達(dá)式B

            667227

            3792461

            16599138

            83457720

            2586941280

            0

            0

            總函數(shù)調(diào)用

            1482939

            20950792

            141892513

            669790534

            5258218577

            6112529945

            26948662625

            函數(shù)調(diào)用A

            603206

            15849306

            119160441

            551913059

            1576965280

            6112529945

            26948662625

            函數(shù)調(diào)用B

            879733

            5101486

            22732072

            117877475

            3681253297

            0

            0

            其中:表達(dá)式A/B、函數(shù)調(diào)用A/B為:給定的n個(gè)數(shù)有/無解時(shí),所處理的表達(dá)式總數(shù)和函數(shù)調(diào)用總次數(shù)。

             

                N=8N=9,兩個(gè)所用時(shí)間只相差13秒,這是由于N8時(shí),有一個(gè)組合(8個(gè)1)無解,判斷這個(gè)組合無解需110多秒,而計(jì)算剩下的125969個(gè)組合還不要50秒。


            程序代碼:

            24.cpp
            posted on 2010-08-15 23:20 flyinghearts 閱讀(2344) 評論(0)  編輯 收藏 引用 所屬分類: 算法編程之美C++
            性高湖久久久久久久久| 激情久久久久久久久久| 久久午夜福利电影| 亚洲一区中文字幕久久| 精品国际久久久久999波多野| 亚洲国产精品成人久久蜜臀| 韩国三级中文字幕hd久久精品 | 精品国产99久久久久久麻豆| 欧美麻豆久久久久久中文| 国内精品伊人久久久久网站| 丰满少妇人妻久久久久久4| 久久精品国产久精国产| 久久久综合九色合综国产| 99久久超碰中文字幕伊人| 国产精品久久国产精麻豆99网站| 精品乱码久久久久久久| 97精品伊人久久大香线蕉app| 东京热TOKYO综合久久精品| 久久r热这里有精品视频| 麻豆精品久久久一区二区| a级毛片无码兔费真人久久| 狠狠精品久久久无码中文字幕| 精品久久久久国产免费| 久久伊人影视| 中文国产成人精品久久不卡| 日韩精品久久久肉伦网站| 久久精品人人做人人爽电影蜜月| 国产精品一久久香蕉产线看 | 97久久精品无码一区二区天美| 久久国产热精品波多野结衣AV| 777米奇久久最新地址| 91久久福利国产成人精品| 久久精品国产亚洲精品| 久久久国产打桩机| 日产精品99久久久久久| 久久精品免费观看| 日本精品久久久久久久久免费| 精品国产乱码久久久久软件| 久久亚洲国产中v天仙www| 少妇被又大又粗又爽毛片久久黑人| 91麻豆国产精品91久久久|