728x90
0. [c++] 백준 |
https://www.acmicpc.net/problem/9663
1. 풀이 |
정말 오래간만에 알고리즘 풀이를 다시 시작했다.
이번 문제는 체스판에 퀸을 배치하는 문제였다.
board라는 배열은 각 층에 배치된 퀸의 위치를 저장하였다.
모든 경로를 탐색하는 백트래킹 기법을 적용하여 퀸이 배치 가능한지 확인을 한 이후, 퀸을 배치하도록 해주었다.
각 층마다 모든 위치에 퀸을 배치해보고, 재귀함수를 활용 다음 층에서도 같은 동작을 반복하도록 하였다.
2. 소스코드 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <iostream> #include<vector> using namespace std; int N,ret; //배열의 순서는 행(row)을 의미하고, 담긴 데이터는 열(column)을 의미한다. int board[16]; bool check(int row, int col) { for (int k = 1;k < row;k++) { //보드에 놓을 퀸이 이미 배치된 퀸의 이동반경에 포함되는 경우 false를 반환하며 함수를 종료한다. if (board[k] == col || abs(board[k] - col) == row - k) { return false; } } //퀸이 어떤 말과도 중복이 되지 않으므로 놓을 수 있다. return true; } //퀸을 놓는 동작을 수행한다. void takedown(int row) { //만일 이번 퀸이 최종적인 퀸이었다면 결과를 1 증가시킨다. if (row == N) ret++; else for (int col = 1;col <= N;col++) { if (check(row + 1, col)) { board[row + 1] = col; takedown(row + 1); } } } int main() { cin >> N; //0을 처음에 선언하는 이유는 함수를 1~N까지 모든 경우를 탐색하게 만들어 주었는데, //main함수에서 N번 호출하는 케이스도 가능하지만, 그 동작을 전부 takedown함수에서 수행하도록 해주었다. //간단하게 정리하자면, 0을 제외한 (1~N,1~N)의 범위를 탐색하도록 함수를 설계한 것이다. takedown(0); cout << ret << endl; } | cs |
3. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
'<백준> > |c++| normal' 카테고리의 다른 글
[C++] 백준 14888 - 연산자 끼워넣기(백트래킹, 브루트포스, 무식하게 풀기) (0) | 2020.02.10 |
---|---|
[c++] 백준 2580 - 스도쿠(재귀호출, 백트래킹) (3) | 2020.02.10 |
[c++] 백준 15652 - N과 M(4) (백트래킹 대신 조건문 활용) (0) | 2020.01.10 |
[c++] 백준 15649 - N과 M (1) (백트래킹, dfs) (0) | 2019.09.19 |
[c++] 백준 10830 - 행렬 제곱(분할 정복인데 비트마스크 활용) (0) | 2019.08.30 |