FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

# 順列生成 Permutation Generator
# 引数 N個 R個 値 ($N, $R, \@Value)
# 戻り値 順列生成 (@Permutation)
sub PERMUTATIONGENERATOR{
my ($N, $R, $Value) = @_;
my @Permutation = ();
my @TempPermutation = ();
my @Position = ();
my @UnusablePosition = ();
my $PossibleToMove = 0;
my $CurrentPosition = 0;
my $PermutationPosition = 0;
$N = int($N);
$R = int($R);
my $R1 = $R - 1;
my $Count = @$Value;

# 個数と配列数の確認
if(($N <= 0) || ($R <= 0) || ($N < $R) || ($N > $Count)){
return 0;
}

if($R == 1){
return @$Value;
}

for(my $i = 0; $i < $N; $i++){
# 初期化 Initialization
&Initialization($N, $R, \@Position, \@UnusablePosition);
$Position[0] = $i;
$UnusablePosition[$i] = 0;

# 順列の値
$TempPermutation[0] = $$Value[$i];

# 配列の位置
$CurrentPosition++;

while($CurrentPosition > 0){
# 移動可能 Possible to Move
$PossibleToMove = &PossibleToMove($N, $Position[$CurrentPosition], \@UnusablePosition);

if($PossibleToMove != -1){
# 使用できない位置 Unusable Position
&UnusablePosition($Position[$CurrentPosition], $PossibleToMove, \@UnusablePosition);
# 配列の位置
$Position[$CurrentPosition] = $PossibleToMove;
# 順列の値
$TempPermutation[$CurrentPosition] = $$Value[$Position[$CurrentPosition]];

if($CurrentPosition == $R1){
# 順列生成 Permutation Generator
$Permutation[$PermutationPosition] = join(" ", @TempPermutation);

# 順列生成 配列の位置
$PermutationPosition++;
}else {
# 配列の位置
$CurrentPosition++;
}
}else {
# 配列情報を削除 Delete Position
$UnusablePosition[$Position[$CurrentPosition]] = -1;
$Position[$CurrentPosition] = -1;

# 配列の位置
$CurrentPosition--;
}
}
}

return @Permutation;
}

# 初期化 Initialization
# 引数 N個 R個 現在の位置 使用できない位置 ($N, $R, \@Position, \@UnusablePosition)
# 戻り値 なし ()
sub Initialization{
my ($N, $R, $Position, $UnusablePosition) = @_;

# 使用できない位置
for(my $i = 0; $i < $N; $i++){
$$UnusablePosition[$i] = -1;
}
# 配列の位置
for(my $i = 0; $i < $R; $i++){
$$Position[$i] = -1;
}
}

# 移動可能 Possible to Move
# 引数 N個 配列の位置 使用できない位置 ($N, $Position[$CurrentPosition], \@UnusablePosition)
# 戻り値 移動可能な位置 ($PossibleToMove)
sub PossibleToMove{
my ($N, $Position, $UnusablePosition) = @_;
my $PossibleToMove = -1;

for(my $i = $Position + 1; $i < $N; $i++){
if($$UnusablePosition[$i] == -1){
$PossibleToMove = $i;

last;
}
}

return $PossibleToMove;
}

# 使用できない位置 Unusable Position
# 引数 配列の位置 移動可能な位置 使用できない位置 ($Position[$CurrentPosition], $PossibleToMove, @UnusablePosition)
# 戻り値 なし ()
sub UnusablePosition{
my ($Position, $PossibleToMove, $UnusablePosition) = @_;

# 使用中
$$UnusablePosition[$PossibleToMove] = $PossibleToMove;

# 未使用にする
$$UnusablePosition[$Position] = -1 if($Position != -1);

return ;
}


一言
順列数はこちら
perlで順列・組合せ 3 順列 (Permutation: PERMUTATION): perlで順列・組合せ: 一寸先は闇
値の重複は無視する
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。