From d61d8e7b8caf50fd30d0338a367644a9420c1a15 Mon Sep 17 00:00:00 2001 From: gyunho Date: Tue, 7 Jan 2025 22:07:07 +0900 Subject: [PATCH 1/2] 2025-01-07 N-Queen --- .gitignore | 3 ++- g0rnn/backtracking/14-g0rnn.cpp | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 g0rnn/backtracking/14-g0rnn.cpp diff --git a/.gitignore b/.gitignore index b9f4630..6eb604d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .idea/ /.vscode cmake-build-debug/ -CMakeLists.txt \ No newline at end of file +CMakeLists.txt +.clang-tidy \ No newline at end of file diff --git a/g0rnn/backtracking/14-g0rnn.cpp b/g0rnn/backtracking/14-g0rnn.cpp new file mode 100644 index 0000000..8b0df99 --- /dev/null +++ b/g0rnn/backtracking/14-g0rnn.cpp @@ -0,0 +1,44 @@ +// +// Created by 김균호 on 2025. 1. 7.. +// +#include +using namespace std; + +#define EMPTY -1 + +int n; +int chess[15] = {0}; +// 배열의 value은 퀸이 놓여진 row를 의미 +// 배열의 index는 퀸이 놓여진 column을 의미 +// ex) chess[3] = 5 -> 퀸이 5행 3열에 놓여져 있다는 의미 + +// col과 row는 퀸을 놓을 열과 행 +// col과 row로 받은 위치에 대해 이미 놓여진 퀸을 피해 놓을 수 있는지 +bool canMoveTo(int col, int row) { + for (int i = 0; i < n; i++) { + if (chess[i] == EMPTY) continue; + if (abs(col - i) == row - chess[i]) return false; // 대각선인 경우 + if (i == col) return false; // 같은 열인 경우 + } + return true; +} + +int findQueen(int cnt, int row) { + if (cnt == n) return 1; + + int total = 0; + for (int col = 0; col < n; col++) { + if (!canMoveTo(col, row)) continue; + chess[col] = row; + total += findQueen(cnt + 1, row + 1); // 가능한 경우의 수의 총합 + chess[col] = EMPTY; + } + return total; +} + +int main() { + cin >> n; + fill(chess, chess + n, EMPTY); + cout << findQueen(0, 0); + return 0; +} From 9590531f83fea6987b5353e8acf388a647385e42 Mon Sep 17 00:00:00 2001 From: gyunho Date: Tue, 7 Jan 2025 22:42:09 +0900 Subject: [PATCH 2/2] add comment --- g0rnn/backtracking/14-g0rnn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/g0rnn/backtracking/14-g0rnn.cpp b/g0rnn/backtracking/14-g0rnn.cpp index 8b0df99..0d55dde 100644 --- a/g0rnn/backtracking/14-g0rnn.cpp +++ b/g0rnn/backtracking/14-g0rnn.cpp @@ -17,7 +17,7 @@ int chess[15] = {0}; bool canMoveTo(int col, int row) { for (int i = 0; i < n; i++) { if (chess[i] == EMPTY) continue; - if (abs(col - i) == row - chess[i]) return false; // 대각선인 경우 + if (abs(col - i) == row - chess[i]) return false; // 대각선인 경우 (row는 항상 chess[i]보다 큼) if (i == col) return false; // 같은 열인 경우 } return true;