码迷,mamicode.com
首页 > 编程语言 > 详细

排列生成算法--C++

时间:2015-05-28 00:35:54      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
  1 #include<iostream>
  2 using namespace std;
  3 //初始化,注意两边的初始化,简化算法
  4 void Init(int n , int *arr , bool * flags)
  5 {
  6     arr[0] = 0xfffffff;
  7     for(int i = 1;i <= n;i++)
  8     {
  9         arr[i] = i;
 10         flags[i] = false;
 11     }
 12     arr[n+1] = 0xfffffff;
 13 }
 14 //检查是否有可移动的地方
 15 bool HaveMove(const int * arr ,const int iLength , int & iIndex ,const bool * flags , bool & bTemp)
 16 {
 17     int iMax = -1;
 18     int iTemp;
 19     for(int i = 1 ;i <= iLength ;i ++)
 20     {
 21         if(flags[i] == false && arr[i] > arr[i-1] && arr[i] > iMax)
 22         {
 23             iTemp = i;
 24             iMax = arr[i];
 25             bTemp = false;
 26         }
 27         else if(flags[i] == true && arr[i] > arr[i+1] && arr[i] > iMax)
 28         {
 29             iTemp = i;
 30             iMax = arr[i];
 31             bTemp = true;
 32         }
 33     }
 34     if(iMax != -1)
 35     {
 36         iIndex = iTemp;
 37         return true;
 38     }
 39     else
 40     {
 41         return false;
 42     }
 43 }
 44 //相应的改变
 45 void Move(int *arr ,int i , bool * flags , bool bTemp , int iLength)
 46 {
 47     int iTemp;
 48     if( bTemp == false)
 49     {
 50         iTemp = flags[i];
 51         flags[i] = flags[i-1];
 52         flags[i-1] = iTemp;
 53         
 54         iTemp = arr[i];
 55         arr[i] = arr[i-1];
 56         arr[i-1] = iTemp;
 57     }
 58     else
 59     {
 60         iTemp = flags[i];
 61         flags[i] = flags[i+1];
 62         flags[i+1] = iTemp;
 63         
 64         iTemp = arr[i];
 65         arr[i] = arr[i+1];
 66         arr[i+1] = iTemp;
 67     }
 68     
 69     for(int i = 1;i <= iLength;i ++)
 70     {
 71         if(arr[i] > iTemp)
 72         {
 73             flags[i] = (flags[i] == false ? true : false);
 74         }
 75     }
 76 }
 77 void Show(const int * arr,int iLength)
 78 {
 79     for(int i = 1;i <= iLength ;i++)
 80     {
 81         cout<<(char)arr[i] << ;
 82     }
 83     cout<<endl;
 84 }
 85 //算法名称
 86 void JonhnsonTrotter(int n)
 87 {
 88     int arr[100];
 89     bool flags[100];
 90     int iIndex;
 91     bool bTemp;
 92     Init( n , arr ,flags);
 93     
 94     Show(arr , n);
 95     while(HaveMove(arr, n , iIndex , flags , bTemp))
 96     {
 97         Move(arr ,iIndex , flags , bTemp , n);
 98         Show(arr , n);
 99     }
100     return;
101 }
102 
103 int main()
104 {
105     int iNum;
106     cin>>iNum;
107     JonhnsonTrotter(iNum);
108     return 0;
109 }
View Code
技术分享
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 //插入--分为需要移动和无需移动元素两种情况
 5 void Insert(int iIndex , int iPreLength , int * arr)
 6 {
 7     int i;
 8     if(iIndex < iPreLength)
 9     {    
10         for(i = iPreLength ;i > iIndex; i--)
11         {
12             arr[i] = arr[i-1];
13         }
14         arr[i] = iPreLength + 1;
15     }
16     else
17     {
18         arr[iPreLength] = iPreLength + 1;
19     }
20 }
21 //回溯--撤销之前的移动
22 void Back(int iIndex , int iPreLength , int * arr )
23 {
24     if(iIndex < iPreLength)
25     {
26         for(int i = iIndex ;i <= iPreLength ;i ++)
27         {
28             arr[i] = arr[i+1];
29         }
30     }
31 }
32 //生成算法,已经有前now个元素,第now+1个元素插在哪里的问题
33 void GetArray(int num , int now ,int arr[10])
34 {
35     if(num == now)
36     {
37         for(int i = 0;i < num ;i ++)
38         {
39             printf("%c " , arr[i]);
40         }
41         printf("\r\n");
42         return ;
43     }
44     else
45     {
46         for(int i = 0 ;i <= now ;i ++)
47         {
48             Insert(i , now, arr);
49             GetArray(num , now + 1 , arr);
50             Back(i , now , arr);
51         }
52     }
53 }
54 int main()
55 {
56     int arr[10];
57     memset(arr, 0 ,sizeof(arr));
58     arr[0] = 1;
59     GetArray(4 , 1 , arr);
60     return 0;
61 }
View Code
技术分享
//字典序
#include<iostream>
using namespace std;
//反转某一区间
void reverse(char* a, int i  ,int j )
{
    char temp;
    while(i != j && i != --j)
    {
        temp = a[j];
        a[j] = a[i];
        a[i] = temp;
        i++;
    }
}
//只有实现,详细可百度
bool Permutation(char * a ,int N)
{
    if(0 == N || 1 == N)
    {
        return false;
    }
    int i = N - 2;
    char temp;
    while(true)
    {
        if(a[i] < a[i+1])
        {
            int j =  N - 1;
            while(!(a[i] < a[j]))
            {
                j--;
            }
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            reverse(a , i + 1, N);
            return true;
        }
        if(0 == i)
        {
            reverse(a, 0 , N);
            return false;
        }
        i--;
    }
}
int main()
{
    char a[] = {1,2,3,4};
    int size = sizeof(a) / sizeof(char);
    for(int i = 0;i < size ;i ++)
    {
        printf("%c" , a[i]);
    }
    printf("\n");
    while(Permutation(a,size))
    {
        for(int i = 0;i < size ;i ++)
        {
            printf("%c" , a[i]);
        }
        printf("\n");
    }
    return 0;
}
View Code

 

排列生成算法--C++

标签:

原文地址:http://www.cnblogs.com/KIKIKS/p/4534728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!