再帰を利用して,任意のn個数の中からm個数を取り出す全配列を求める.

8305 ワード

再帰を利用して,任意のn個数の中からm個数を取り出す全配列を求める.
分析:
n個の数の全配列を求めて、つまり:
  • の最初の数は動かず、後ろのn-1の数を全列
  • に並べた.
  • 第2の数と第1の数を交換し、後のn-1の数を全配列(交換に注意)
  • 第3の数と第1の数を交換し、その後、後のn-1の数を全列...第nの数と第1の数を交換し、その後、後のn-1の数を全列
  • とする.
    n−1が1に等しくなるまで再帰的な考え方を用いて実現できる.
    m個の数を取り出してn-m=1を終了させると、次のように直接コードを貼ることができます.
    #include//     
    using namespace std;
    bool is_swap(int start , int last , int *p )//  ,    start~i       ,      ,         
    {
        for(int i = start ; i < last ; i++)
            if(p[i]==p[last])return false;
        return true;
    }
    void perm(int start , int last , int *p ,int len)   //     
    {
        if(start==len){
                for(int i = 0 ; i < len ; i++)
            printf("%d ",p[i]);
            printf("
    "
    ); } else { for(int i = start ; i <= last ; i++) if(is_swap(start , i , p)) { swap(p[start],p[i]); perm(start+1 , last , p , len); swap(p[start],p[i]); } } } int main() { static int n;// static int m;// cin>>n; cin>>m; int *arr = new int[n]; for(int i = 0 ; i < n ; i++) cin>>arr[i]; perm(0 , n-1 , arr , m); return 0; }