回溯法

来源:互联网 发布:喜欢单曲循环的人 知乎 编辑:程序博客网 时间:2024/05/16 02:34

设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组合)(排列数)


#include<iostream>
using namespace std;

char *a;
bool check(int i)
{
    for(int j = 0;j < i;j++)
    {
        if(a[i] == a[j])//相同
        {
            return false;
        }
    }
    return true;
}

void output(char *a,int n)
{
    for(int i = 0;i < n;i++)
    {
        cout<<a[i] <<" ";
    }
    cout<<endl;
}

//递归回溯法
void backTrack(int i,int n,int m)
{
    if(i >= m)
    {
        output(a,m);
    }
    else
    {
        for(int j = 0;j < n;j++)
        {
            a[i] = 'A' + j;
            if(check(i))
            {
                backTrack(i + 1,n,m);
            }
        }
    }
}

int main()
{
    int n,m;
    cout<<"请输入前n个数:"<<endl;
    cin>>n;
    cout<<"请输入n个数中的m个数排序:"<<endl;
    cin>>m;
    a = new char[n];
    backTrack(0,n,m);
    return 0;
}