求全排列的方法

深度优先法

#include <stdio.h>
int sum = 0;
int n;
int in_hand[10];
int tmp[10];
void dfs(int in_)
{
    if(in_ == n+1)
    {
        ++sum;
        for(int i = 0; i != n+1;++i)    printf("%d ",tmp[i]);
        printf("\n");
        return ;
    }

    for(int i = 0; i != n+1 ; ++i)
    {
        if(in_hand[i] == 1)
        {
            tmp[in_] = i;
            in_hand[i] = 0;
            dfs(in_+1);
            in_hand[i] = 1;
        }   
    }
    return ;
}

int main()
{
    printf("排序从0-n个数进行排序,也就是n+1个数,结果为(n+1)*n*(n-1)*....1  以下输入n\n");
    p:scanf("%d",&n);if(n >= 10 || n <= 0)  {printf("输入有误!重新输入.\n"); goto p;}
    for(int i = 0; i != n+1;++i)    in_hand[i]=1;
    dfs(0);
    printf("%d",sum);
    return 0;
}

递归算法

#include <bits/stdc++.h>
#define rep( x, a, b ) for ( int x = a; x != b; ++x )
using namespace std;
int total;
string  str = "1234567890";
void handle( string a, string b )
{
    if ( a.size() == str.size() )
    {
        /*  printf("%s\n",a.c_str()); */
        total++;
        return;
    }else{
        rep( x, 0, b.size() )
        {
            string tmpa( a );


            string tmpb( b );


            string  tmp1    = tmpa + tmpb.at( x );
            string  tmp2    = tmpb.erase( x, 1 );
            handle( tmp1, tmp2 );
        }
    }
}


int main()
{
    handle( "", str );
    printf( "%d\n", total );
}

STL next_permutation函数

#include <bits/stdc++.h>
#define rep( x, a, b ) for ( int x = a; x != b; ++x )
using namespace std;
int total;
string  str = "abcdefghij";

int main()
{
    do
    {
        total++;
    }
    while ( next_permutation( str.begin(), str.end() ) );
    printf( "%d\n", total );
}
原创文章 54 获赞 168 访问量 63万+

猜你喜欢

转载自blog.csdn.net/bojie5744/article/details/51025876
今日推荐