알고리즘/DFS
[프로그래머스]N-Queen(c++,c)
잉읭응
2021. 1. 14. 10:32
반응형
문제풀이:programmers.co.kr/learn/courses/30/lessons/12952?language=cpp
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
n-queen 문제입니다.
아래 백준 문제와도 동일합니다.
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
[백준] 9663-N-Queen(C++)
문제링크:https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는..
gusdnr69.tistory.com
2차원배열이 아닌 1차원 배열로 구현할 수 있습니다.
1. row배열에 열값을 넣는다.
2. 넣으면 같은열에 있는 좌표가 있는지,
3. 대각선 상으로 일치하는 부분이 있는지 검사한다.
3가지 를 순서대로 구현해주면 되는 백트래킹 문제였습니다.
아래는 정답코드입니다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <cmath>
int N, result = 0;
int row[13] = { 0, }; //열값을 넣어줄 예정
bool checked(int r) {
for (int i = 0; i < r; i++) {
if (row[i] == row[r])
return false;
else if (abs(row[i] - row[r]) == r - i)
return false;
}
return true;
}
void dfs(int r) {
if (N == r) {
result++;
return;
}
for (int i = 0; i < N; i++) { //0열부터 n-1열까지 검사
row[r] = i;
if (checked(r)) {
dfs(r + 1);
}
row[r] = 0;
}
return;
}
int solution(int n) {
int answer = 0;
N = n;
dfs(0);
answer = result;
return answer;
}
반응형