Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 재귀
- MST
- 순열
- 조합
- 빠른 입출력
- 클래스
- 중복 순열
- 비트마스크
- 메모리풀
- 백트래킹
- 스택
- Knapsack
- DP
- 피보나치 수
- dfs
- SSAFY
- 우선순위 큐
- 크루스칼
- 문자열
- 시뮬레이션
- BFS
- 완전 탐색
- 링크드리스트
- 큐
- 분할 정복
- lis
- 이분 탐색
- 그리디
- BeautifulSoup
- 세그먼트 트리
Archives
- Today
- Total
작심 24/7
[백준] 9663번 N-Queen 본문
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
백트래킹의 대표적인 문제이다.
이차원 배열을 만들 필요 없이 일차원 배열로
인덱스는 행, 값은 열을 넣어주어 풀 수 있다.
퀸이 배치될 수 있는 조건은
1. 같은 행에 있지 않을 때
2. 같은 열에 있지 않을 때
3. 같은 대각선 상에 있지 않을 때
이다.
1번의 경우는 queen이라는 일차원 배열을 만듦으로써 행이 겹칠 수가 없게 된다.
2번과 3번의 경우는 인덱스 0부터 현재 행 전까지 돌아가는 for문을 끝까지 돌면서
현재 위치가 queen을 놓을 수 있는 조건인 경우 다음 행(다음 queen)을 위해 recursion 해주고
2번이나 3번의 조건에 한 번이라도 걸리는 경우 queen을 놓을 수 없으므로
break로 빠져나온 뒤 다음 열로 넘어가 다시 검사한다.
#include <iostream>
#include <cstdlib>
using namespace std;
int queen[15], cnt;
void chessBoard(int N, int current) {
if (current == N) cnt++; //모든 퀸을 배치 했으면 카운트
else {
for (int i = 0; i < N; i++) {
queen[current] = i; //일단 현재 행 배열에 현재 열을 넣어준다
bool pass = true;
for (int j = 0; j < current; j++) {
if (abs(queen[current] - queen[j]) == current - j || queen[j] == queen[current]) { //현재 위치가 다른 퀸의 대각선이거나 같은 열이라면 다음 열에 넣어주기 위해 빠져나온다.
pass = false;
break;
}
}
if (pass) chessBoard(N, current + 1); //현재 위치가 알맞은 위치라면 다음 행(다음 퀸)으로 넘어간다.
}
}
}
int main() {
int N;
cin >> N;
chessBoard(N, 0);
cout << cnt;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 14888번 연산자 끼워넣기 (C++, JAVA) (0) | 2020.05.25 |
---|---|
[백준] 2580번 스도쿠 (0) | 2020.05.25 |
[백준] 15652번 N과 M - 4 (C++, JAVA) (0) | 2020.05.24 |
[백준] 15651번 N과 M - 3 (C++, JAVA) (0) | 2020.05.24 |
[백준] 15650번 N과 M - 2 (C++, JAVA) (0) | 2020.05.24 |
Comments