문제 내용
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
풀이 시간
24분
풀이 과정
백트래킹을 이용하여 풀이
promising 조건 찾는데에 시간을 대부분 소비
정답 코드
1. 파이썬
#pypy3로 해서 통과함
import sys
sys_input=sys.stdin.readline
n=int(sys_input())
cur=[]
ans=0
def success(row,col):
for x,y in cur:
if col==y or row+col==x+y or row-col==x-y:
return False
return True
def back_tracking(level):
if len(cur)==n:
global ans
ans+=1
return
for i in range(1,n+1):
if success(level,i):
cur.append((level,i))
back_tracking(level+1)
cur.pop()
back_tracking(1)
print(ans)
2. 자바
import java.io.*;
import java.util.*;
public class Main {
public static int n, ans = 0;
public static List<Integer> cur = new ArrayList<>();
public static boolean promising(int y) {
for (int nx = 0; nx < cur.size(); nx++) {
if (cur.get(nx) == y || cur.size() - nx == Math.abs(cur.get(nx) - y)) {
return false;
}
}
return true;
}
public static void back_tracking() {
if (cur.size() == n) {
ans += 1;
return;
}
for (int i = 0; i < n; i++) {
if (promising(i)) {
cur.add(i);
back_tracking();
cur.remove(cur.size() - 1);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
back_tracking();
System.out.println(ans);
}
}
'코딩테스트 > 문제' 카테고리의 다른 글
[BOJ] 12026번: BOJ거리 (0) | 2024.04.02 |
---|---|
[백준] 15652번: N과 M (4) (0) | 2023.12.20 |
[백준] 15650번: N과 M (2) (0) | 2023.12.19 |
[백준] 1932번: 정수 삼각형 (0) | 2023.12.19 |
[백준] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2023.12.18 |