ビットマスクを使用して文字列のすべての順列を生成しています。ビットマスクを使用して順列を生成する
void recurse(string s, int mask,int taken){
if(taken == n){
cout << " ";
return;
}
for(int i = 0; i < n; i++){
if(((1 << i) & mask) == 0){
cout << s[i];
recurse(s, (mask|(1 << i)), taken + 1);
}
}
}
この関数では、nは文字列の長さです。私は今までに撮影された変数を使って何文字が印刷されているかを把握しています。私は
recurse(s,0,0);
を呼び出しています。しかし、これは正しく動作していない主な機能には 。 入力
赤
ために、その出力は、私が間違っているつもりです
赤デERD DR DRE ER
のですか?
UPDATE //コード以下は正常に動作します。
void recurse(string s, int mask,int taken, string pref){
if(taken == n){
cout << pref <<endl;
return;
}
for(int i = 0; i < n; i++){
if(((mask >> i) & 1) == 0){
recurse(s,(mask | (1 << i)),taken + 1, pref + s[i]);
}
}
}
これはそのままコンパイルされません。 「n」とは何ですか? – Ron
できません。私はいくつかの条件が偽になると、最適化として再帰を中断しなければならない。 next_permutationは大きな文字列に対して多くの時間を要します。 – Mustafa
nはグローバル変数です。 – Mustafa