permutohedronを使う
順列全探索(昇順)
code:Rust
let mut xs = vec!3, 1, 4, 1, 5;
xs.sort(); // 1, 1, 3, 4, 5
while {
do_something(&xs);
xs.next_permutation()
} {}
ちなみにwhile {} {}というのは条件式の部分にすべての式を詰め込むことで擬似的なdo-whileを実現するテク
順列全探索(降順)
code:Rust
let mut xs = vec!3, 1, 4, 1, 5;
xs.sort();
xs.reverse(); // 5, 4, 3, 1, 1
while {
do_something(&xs);
xs.prev_permutation()
} {}
組合せ全探索($ _n \mathrm C _r)
code:Rust
// flagsi: i 番目の要素を含むか否か
let mut flags = vec!false; n - r;
flags.append(&mut vec!true; r);
while {
do_something(&flags);
flags.next_permutation()
} {}
重複組合せ全探索($ _n \mathrm{H} _r)
code:Rust
// flags: true を仕切りとして、 false をランレングス圧縮すると各種類ごとの使う個数になる
let mut flags = vec!false; n;
flags.append(&mut vec!true; r - 1);
while {
do_something(&flags);
flags.next_permutation()
} {}