深さ優先探索 DFS および順列 STL next_permutation による全探索
[履歴] (2016/07/01 00:38:05)
最近の投稿
注目の記事

サンプルコード

#include <iostream>
#include <algorithm> // next_permutation のため。
using namespace std;

const int MAXN = 1024;

bool used[MAXN];
int perm[MAXN];
int perm2[MAXN];

// 表示用関数
void display(int* ptr, int n) {
    for(int i = 0; i < n; ++i) {
        cout << ptr[i] << " ";
    }
    cout << endl;
}

// 再帰関数による全探索 (深さ優先探索)
void permutation(int pos, int n) {
    if(pos == n) {
        display(perm, n);
        return;
    }
    for(int i = 0; i < n; ++i) {
        if(!used[i]) {
            perm[pos] = i;
            used[i] = true;
            permutation(pos + 1, n);
            used[i] = false;
        }
    }
}

// std::next_permutation による全探索 (順列の生成)
void permutation2(int n) {
    for(int i = 0; i < n; ++i) {
        perm2[i] = i;
    }
    do {
        display(perm2, n);
    } while(next_permutation(perm2, perm2 + n));
}

int main() {
    permutation(0,3); cout << endl;
    permutation2(3);
    return 0;
}

出力例

$ g++ -Wall -O2 main.cpp && ./a.out
0 1 2 
0 2 1 
1 0 2 
1 2 0 
2 0 1 
2 1 0 

0 1 2 
0 2 1 
1 0 2 
1 2 0 
2 0 1 
2 1 0 
関連ページ
    概要 部分問題を解きまくって、問題を解く手法です。DFS 全探索とは発想が異なり、例えば i が大きい後ろからある種の全探索します。部分問題の結果をメモリに格納 (メモ化) しておき、より大きな部分問題を解くときに利用します。 問題文を図にしてみる i の大きい後ろに限定した部分問題を見つける i 番目を「とれる (とる, とらない), とれない」で場合分けして漸化式を得る
    概要 限られた時間の中で問題を解くために必要となる、競技プログラミングにおける基本的な処理のチートシートです。競プロにおけるメジャー言語 C++ を利用します。その際 C++11 の機能は利用せず C++03 の機能の範囲内で記述します。 頻度高く定期的に開催されるコンテスト AtCoder Codeforces