質問

私の計算に組みのサイズのセットのサイズX.ることができましたし(1,2,3),い順列のサイズ2,3P2い(1,2) (1,3) (2,1) (2,3) (3,1) (3,2).

両方のGSLおよびC++STLのみ提供しxPxることができます。が誰かにも、C/C++の図書館ができることまたはフルスペルでの高速メモリの効率的なアルゴリズム?

ようにしているため非常に短い暗.私は今学びたい力攻撃ができます。私は"ouglg ouyakl"amチェック毎に順列に対して非常に良い辞書で調べました。私は消去2文字で24P7は1,744,364,160可能性があるんです。私は、Perlプログラムにも、これ面白い試験の総合効率プログラミングの時間+走ります。:)

(わないという答えの暗.)

役に立ちましたか?

解決

私が使用したこののライブラリーの前に(それはC ++であることに注意)似た何かをするために必要なコードインチこれは、と繰り返しなしで、順列と組み合わせを持っています。あなたの問題のために、これで十分です(未テスト...):

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

std::vector<int>::iterator first = v.begin(), middle = v.begin() + 2, last = v.end();

do {
    // do stuff with elements in range first...middle (but dont change them)
} while(next_partial_permutation(first, middle, last));

他のヒント

あなたはフラグのstd::next_permutation()vector<bool>を使用して組み合わせを得ることができます。 (1,2,3)から2つの要素を選ぶのあなたの例を取ると、(false, true, true)としてあなたのベクトルを開始します。この上next_permutation()を繰り返すことあなたがオーバー開始する前に、その後、(true, false, true) (true, true, false)得られます。

もし順列ない組み合わせたいので

、実際の要素の組に各組み合わせをマップ(例えば(true, false, true)(1、3)となる)、再度、これらの使用next_permutation()のすべての順列を生成します。

いexaclyお問い暗.たい場合には最長の見換(anagram)この言葉の一つひとつを、辞書きしています。

  1. をビットマスクの言葉です。できるのではないでしょうかを使用または64ビット演算できるとほぼ3alpahbetsます。

a->最初のビットb->第二ビットです。合言葉は、"ouglg ouyakl"の場合とのことですが、

 abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzabcdefghijklmnop
 100000100011001000001001000000010000100100000100000000000000000000

(ご希望のなかったの逃したもの) 今作と同じbitmasksお話します。

時のチェクイン対彙るためには、ただひたすらい

 vocabulary & ( ouglg_ouyakl ^ vocabulary)

こtrows0の場合は単語からouglg_ouyakl.

約順列

for each permutation of numbers fom  1-n // that is 1,2 and 2,1
  for(i=0;i<end;i++)
    for(j=i+1;j<end;j++)
      SET[permutation[i]],SET[permutation[j]]

編集:prevous solutonたinapropriateのための24P7.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top