再帰を利用して,任意の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を終了させると、次のように直接コードを貼ることができます.
分析:
n個の数の全配列を求めて、つまり:
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;
}