[アルゴリズム]遡及
遡及定義
backtrackingは、ツリー構造に基づいてDFSを使用して深度ナビゲーションを行い、各ルートディレクトリが条件に合致しているかどうかを確認します.ツリー内の条件に合致しないノードがDFSを使用して深度ナビゲーションを行わなくなった場合、ブランチを破棄します.
N Queen問題例
に答える
コード#コード#
#include <iostream>
using namespace std;
int queen_col[15] = {0};
int cnt = 0;
//현재 들어온 열 값이 가능한지 여부 판단
bool is_available(int current_row) {
for (int row = 0; row < current_row; row++) {
// 같은 열에 있어도 안되고, 대각선이 있어도 안된다.
if ((queen_col[row] == queen_col[current_row]) || (current_row - row == abs(queen_col[current_row] - queen_col[row]))) {
return false;
}
}
return true;
}
void nqueen(int N, int current_row) {
if (current_row == N) { //끝까지 다 놓은 경우 성공
cnt++; //개수 +1
return;
}
for (int col = 0; col < N; col++) {
queen_col[current_row] = col; //현재 행에 후보 열을 놓아보고
if (is_available(current_row)) {
nqueen(N, current_row + 1); //가능하면 DFS
}//안되면 후보 열 전체 탈락
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
nqueen(N, 0 );
cout << cnt << '\n';
return 0;
}
Reference
この問題について([アルゴリズム]遡及), 我々は、より多くの情報をここで見つけました https://velog.io/@jsleeg98/알고리즘-백트래킹テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol