青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

分治法實現(xiàn)全排列

Posted on 2011-04-17 16:28 tianwen 閱讀(509) 評論(0)  編輯 收藏 引用

使用分治法實現(xiàn)一個全排列算法。先來看一下算法實現(xiàn)后的效果:

['a','b','c'].
permutation
["a", "b", "c"],
["a", "c", "b"],
["b", "a", "c"],
["b", "c", "a"],
["c", "b", "a"],
["c", "a", "b"]。
注意最后兩項,我先以為可以用next_permutation實現(xiàn)的,后來發(fā)現(xiàn)分治法求出的排序和next_permutation并不一樣。

算法描述

分治法求解問題分為三個步驟:
- 分解:將問題分為若干個子問題。
- 解決:遞歸地求解每個子問題。
- 合并:將每個子問題的解合并成為整個問題的解。

現(xiàn)在我們需要求具有n個元素的數(shù)組A的全排列。例如:大小為3的數(shù)組A=[a,b,c] (為方便起見,我把引號全都省略了,其實應(yīng)該是A=['a','b','c']。下同),它的全排列為:
[[a,b,c],
[a,c,b],
[b,a,c],
[b,c,a],
[c,a,b],
[c,b,a]]
這是一個大小為 n!*n 的二維數(shù)組。

使用分治算法求解全排列的過程如下
- 分解:將數(shù)組分為子數(shù)組 A[1..k-1] 和一個元素 A[k]。 (1≤k≤n)
- 解決:遞歸地求解每個子數(shù)組 A[1..k-1] 的全排列,直至子數(shù)組A[1..k-1]為空時結(jié)束遞歸。
- 合并:將上一步的結(jié)果—A[1..k-1]的全排列(一個二維數(shù)組)與元素A[k]合并,得出A[1..k]的全排列。例如:
[[]] 與 a 合并得到 {a}
{a} 與 b 合并得到 [[a,b], [b,a]]
[[a,b],[b,a]] 與 c 合并得到 [[a,b,c],[a,c,b],[c,a,b],[b,c,a],[c,a,b],[c,b,a]]

看下面的圖示會更直觀一些

1. 分解過程

[a,b,c]
/ \
[a,b] c
/ \
[a] b
/ \
[] a

2. 合并過程

[] a
\ /
{a} b
\ /
[[a,b],[b,a]] c
\ /
[[a,b,c],
[a,c,b],
[c,a,b],
[b,a,c],
[b,c,a],
[c,b,a]]

1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            51
            
#include <cstring>
            #include <iostream>
            using namespace std;
            #define N 4
            char str[10];
            void Perm(char *str, int k, int m);
            void Swap(char &a, char &b);
            int main()
            {
            int n;
            while(scanf("%d", &n) != EOF)
            {
            for(int i=0; i<=n; ++i)
            {
            str[i] = i+'0';
            }
            Perm(str, 1, n);
            }
            return 0;
            }
            void Perm(char *str, int k, int m)
            {
            int i;
            if(k == m)
            {
            for(i=1; i<=m; ++i)
            cout<<str[i]<<" "<<flush;
            cout<<endl;
            return;
            }
            for(i=k; i<=m; ++i)
            {
            Swap(str[k], str[i]);
            Perm(str, k+1, m);
            Swap(str[k], str[i]);
            }
            }
            void Swap(char &a, char &b)
            {
            char tmp = a;
            a = b;
            b = tmp;
            }

以上也是BUCT OJ 1140 分治法求解全排列問題的解答報告

但是對于字符串中存在重復(fù)的,比較1123,網(wǎng)上給出了這個源碼:
http://fayaa.com/code/view/13115/

1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            51
            52
            53
            54
            55
            56
            57
            58
            59
            60
            61
            62
            
#include <iostream>
            #include <cstring>
            using namespace std;
            #define N 4
            void Swap(char *pa, char *pb);
            void FullPermutation(char *str, int k, int n);
            int IsAppeared(char *str, char t, int begin, int end);
            char str[N+1] = "ADCD";
            int main()
            {
            FullPermutation(str, 0, N);
            return 0;
            }
            void Swap(char *pa, char *pb)
            {
            if(pa != pb)
            {
            char tmp = *pa;
            *pa = *pb;
            *pb = tmp;
            }
            }
            //判斷字符t在字符串的下標begin到end處是否出現(xiàn)過
            int IsAppeared(char *str, char t, int begin, int end)
            {
            for(int j=begin; j<=end; ++j)
            {
            if(t == str[j])
            return 1;
            }
            return 0;
            }
            /*對字符串進行全排列,注意該函數(shù)處理了字符重復(fù)的情況,字符重復(fù)的情況有兩種:
            1. str[i]本身和后面的str[k]相同
            2. str[k]在k+1到i-1的下標之間已經(jīng)出現(xiàn)過(用IsAppeared()函數(shù)去判斷)
            */
            void FullPermutation(char *str, int k, int n)
            {
            if(k == n)
            {
            cout<<str<<endl;
            return;
            }
            for(int i=k; i<n; ++i)
            {
            if(i!=k && (str[i]==str[k]) || IsAppeared(str,str[i],k+1,i-1)) ////用以處理元素重復(fù)的情況
            continue;
            Swap(str+k, str+i);
            FullPermutation(str, k+1, n);
            Swap(str+k, str+i);
            }
            }
» 作者:wentian

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


posts - 1, comments - 0, trackbacks - 0, articles - 0

Copyright © tianwen

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲视频观看| 亚洲国产视频a| 亚洲丝袜av一区| 亚洲美女视频网| 亚洲婷婷在线| 午夜精品一区二区三区在线视 | 国产精品va| 国产精品www.| 国产精品久在线观看| 在线观看免费视频综合| 午夜精品亚洲| 久久国产高清| 久久亚洲精品欧美| 欧美国产一区二区在线观看| 久久久精品国产免大香伊 | 一区二区av在线| 亚洲欧美国产高清va在线播| 亚洲欧美在线磁力| 久久久久网址| 亚洲国产三级| 亚洲国产高清自拍| 在线亚洲电影| 久久久久久999| 欧美日韩中文字幕精品| 国产精品人成在线观看免费| 黑人一区二区三区四区五区| 最近中文字幕日韩精品| 亚洲欧美卡通另类91av| 久久午夜精品一区二区| 91久久国产综合久久蜜月精品| 亚洲精品黄网在线观看| 午夜精品久久久久久久久| 牛人盗摄一区二区三区视频| 国产精品一区久久久| 亚洲激情小视频| 亚洲欧美另类在线观看| 欧美电影打屁股sp| 午夜视频一区| 欧美日韩国产在线看| 亚洲第一精品夜夜躁人人躁| 欧美亚洲综合在线| 亚洲精品国产精品久久清纯直播| 欧美一区午夜精品| 国产精品a久久久久久| 在线观看日韩av电影| 午夜欧美大尺度福利影院在线看 | 国产精品久久久久国产a级| 日韩亚洲欧美综合| 老鸭窝91久久精品色噜噜导演| 国产精品日韩电影| 日韩一级裸体免费视频| 欧美成人一区二区| 久久久久久有精品国产| 国产精品久久久久久久一区探花| 亚洲精品美女免费| 欧美不卡一卡二卡免费版| 亚洲欧美在线免费观看| 欧美偷拍一区二区| 一本大道av伊人久久综合| 欧美高清在线精品一区| 亚洲午夜一二三区视频| 国产精品三级久久久久久电影| 亚洲精品一区二区三区av| 欧美激情91| 国产精品日韩专区| 欧美岛国在线观看| 国产精品一区二区三区成人| 老司机午夜精品视频| 国产精品黄色在线观看| 免费成人黄色| 黄色成人在线| 久久久久久婷| 浪潮色综合久久天堂| 国产精品久久7| 一本久道久久久| aa亚洲婷婷| 欧美人妖另类| 亚洲片在线资源| av成人毛片| 欧美日韩一区二区三区高清| 亚洲欧洲一区| 中文av字幕一区| 国产精品狼人久久影院观看方式| 亚洲精品乱码久久久久久日本蜜臀| 有坂深雪在线一区| 欧美激情免费观看| 99这里有精品| 久久精品国产免费观看| 伊人一区二区三区久久精品| 久久综合给合久久狠狠色| 欧美1区免费| 亚洲一区在线免费观看| 国产欧美日本一区视频| 欧美在线高清视频| 亚洲经典一区| 欧美中文在线观看国产| 黄色在线一区| 亚洲经典视频在线观看| 99国产精品| 韩国成人福利片在线播放| 免费欧美日韩国产三级电影| 亚洲日产国产精品| 久久精品国产久精国产爱| 亚洲欧洲精品一区二区三区不卡 | 99热免费精品在线观看| 在线视频精品| 亚洲国产成人精品女人久久久 | 伊人色综合久久天天| 欧美精品久久一区| 久久琪琪电影院| 欧美一区二区啪啪| 午夜老司机精品| 99在线精品观看| 日韩一级成人av| 亚洲日韩欧美视频一区| 亚洲国产成人91精品| 久久久蜜桃一区二区人| 亚洲欧美色婷婷| 亚洲综合清纯丝袜自拍| 99视频有精品| 亚洲欧美日韩国产一区二区三区 | 亚洲一区二区动漫| 一区二区激情小说| 麻豆成人在线| 免费在线看成人av| 快播亚洲色图| 欧美日韩一区二区三区| 国产精品狠色婷| 极品av少妇一区二区| 亚洲国产视频直播| 夜夜嗨av一区二区三区免费区| 亚洲人成网站色ww在线| 中文高清一区| 久久综合狠狠| 日韩午夜激情电影| 亚洲欧美一区二区原创| 久久国产日韩| 欧美视频在线一区二区三区| 国产精品亚洲欧美| 亚洲精品久久视频| 久久午夜影视| 中文日韩欧美| 麻豆成人91精品二区三区| 国产午夜精品美女毛片视频| 亚洲精品日日夜夜| 久久影视三级福利片| 亚洲视频在线观看| 欧美阿v一级看视频| 国外成人免费视频| 亚洲午夜性刺激影院| 欧美成人tv| 久久亚洲午夜电影| 黄色欧美日韩| 久久久久网址| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品青草久久| 欧美一区成人| 亚洲欧美日韩爽爽影院| 欧美日一区二区在线观看| 亚洲激情偷拍| 一本一本久久| 国产精品第十页| 欧美一级黄色录像| 亚洲免费小视频| 黑人一区二区| 91久久夜色精品国产网站| 亚洲国产精品美女| 亚洲欧美日韩人成在线播放| 国产精品日日做人人爱| 欧美一级久久久| 久久精品一区二区三区四区| 有码中文亚洲精品| 亚洲精品一二| 黄色精品一区| 在线一区二区三区四区五区| 国产欧美日韩不卡免费| 欧美第一黄色网| 国产精品美女久久| 欧美成人午夜| 国产色产综合色产在线视频| 欧美大片在线观看一区| 国产精品一区二区三区四区五区| 玖玖视频精品| 国产日韩欧美在线| 最新亚洲视频| 136国产福利精品导航网址应用| 日韩系列欧美系列| 激情视频一区二区| 亚洲欧美日韩精品| 午夜一级久久| 国产精品网红福利| 99在线观看免费视频精品观看| 亚洲国产精品电影| 欧美一区二区三区免费观看| 一个色综合导航| 欧美午夜影院| 欧美一级片久久久久久久| 亚洲综合另类| 狠狠久久婷婷| 牛夜精品久久久久久久99黑人|