字符串或数组全排列的三种方法

来源:互联网 发布:梦幻古龙服务端源码 编辑:程序博客网 时间:2024/06/05 08:58

先看最简单的一种:

void perm2(int *arr, int n, int len){    for (int i = 0; i < len; i++)    {        for (int j = 0; j < len; j++)        {            for (int k = 0; k < len; k++)            {                if ((i != k) && (i != j) && (j != k))                {                    cout <<arr[i] <<arr[j] << arr[k]<<endl;                }            }        }    }}int main(){    int arr[] = { 1, 2, 3};    int len = sizeof(arr) / sizeof(arr[0]);    perm2(arr,0,len);    system("pause");}

另一种:递归,用一个数组标记数字是否被用过

#include<iostream>using namespace std;#define N 3int used[N] = { 0 };//标记int num[N];//结果int mat[N] = { 1, 2, 3};//原来的数据void shown(int ceng){    if (ceng >= N)    {        for (int i = 0; i < N; i++)        {            printf("%4d", num[i]);        }        printf("\n");//显示数据    }    else    {        for (int i = 0; i < N; i++)        {            if (!used[i])            {                used[i] = 1;//代表用过                num[ceng] = mat[i];//写入结果                shown(ceng + 1);                used[i] = 0;//用完了            }        }    }}int main(){    shown(0);    cout << coun << endl;    system("pause");    return 0;}

1.先将当前字符串打印出来
2.将倒数第二个字符后移
3.将字符串打印出来
4.倒数第三个字符调用上过程
5.第一个字符调用以上过程

#include<iostream>using namespace std;void perm1(int *arr, int n,int len){    if (n ==len)    {        for (int i = 0; i < len; i++)        {            cout << arr[i] << " ";        }        cout << endl;    }    else    {        for (int pInt = n; pInt < len; pInt++)        {            swap(arr[n], arr[pInt]);            perm1(arr, n + 1, len);            swap(arr[n], arr[pInt]);        }    }}int main(){    int arr[] = { 1, 2, 3};    int len = sizeof(arr) / sizeof(arr[0]);    perm2(arr,0,len);    cout << coun << endl;    system("pause");}
0 0
原创粉丝点击