搜索与回溯系列十一 全排列

2020-02-14  本文已影响0人  徐慵仙

题目

设n个整数的集合{1,2,3,,,n},从中取出r个进行排序(r<n),试列出所有可能。

代码

#include <iostream>
using namespace std;
int n,r;
int a[1001];
int b[1001]={0};
int total=0;
void print(){
    total++;
    for(int i=1;i<=r;i++) cout<<a[i]<<" ";
    cout<<endl;
}
void search(int k){
    for(int i=1;i<=n;i++){
        if(!b[i]){
            a[k]=i;
            b[i]=1;
            if(k==r) print();
            else search(k+1);
            b[i]=0;
        }
    }
}
int main(){
    cin>>n>>r;
    search(1);
    cout<<total;
    }

分析

套模版练习题

1 for循环范围

即可选范围,对于任意k层,1~n中任何一个数都可选,故for循环范围为1~n

    for(int i=1;i<=n;i++)

2 可选条件

只要没用使用过都可选,用一个数组b表示是否使用过,若i使用过,则把b[i]设为1,入b[10]没用使用过,则b[10]=0;

if(!b[i])

3 选择后的变化

if(!b[i]){
            a[k]=i;
            b[i]=1;
      
        }

4 结束条件

if(!b[i]){
            a[k]=i;
            b[i]=1;
            if(k==r) print();
            else search(k+1);
        }

5 回溯

if(!b[i]){
            a[k]=i;
            b[i]=1;
            if(k==r) print();
            else search(k+1);
            b[i]=0;
        }
上一篇 下一篇

猜你喜欢

热点阅读