728x90
8퀸 문제는
8*8의 체스판에서 퀸 8개를 서로 공격할 수 없게 배치하는 경우의 수를 구하는 문제입니다.
수학자 사우스가 틀린 것으로도 유명하죠.
정답을 만족하기 위해서는 몇가지 조건을 반드시 지켜야 합니다.
1. 각 열에는 퀸을 1개만 배치한다.
2. 각 행에 퀸을 1개만 배치한다.
3. 대각선을 그엇을 때 그위에 퀸이 1개만 있도록 한다.(대각선은 총 30개입니다.)
이 조건을 만족하는 퀸의 배치 경우의 수를 구해야 합니다.
public class eightqueen{
//가로에 퀸이 있으면 true 없으면 false 저장하는 배열
static boolean[] a= new boolean[8];
//우상향 대각선에 퀸이 있으면 true 없으면 false을 저장하는 배열
static boolean[] b= new boolean[15];
//우하향 대각선에 퀸이 있으면 true 없으면 false을 저장하는 배열
static boolean[] c= new boolean[15];
//위치 저장하는 배열
static int[] ind = new int[8];
//위치를 출력하는 부분
static void print() {
for(int i =0;i<8;i++) {
System.out.printf("%2d", ind[i]);
}
System.out.println();
}
//i는 첫열의 퀸 위치를 의미함.
static void q8(int i) {
for(int j=0;j<8;j++) {
//j는 행을 의미합니다.
//j행에 퀸이 없다면, 우상향, 우하향 대각선에 퀸이 없다면 i열의 j열에 퀸이 배치됨.
if(a[j]==false && b[i+j]==false && c[i-j+7]==false) {
ind[i]=j;
//7열까지 모두 배치하고 나면 print됨.
if(i==7) {
print();
}
else {
//i열, j행에 배치했으므로 행과 우상향 우하향 대각선 배열에 true를 넣음.
a[j]=b[i+j]=c[i-j+7]=true;
//다음열로 넘어가 배치를 진행함.
q8(i+1);
//모두 배치되었다면, false로 다시 다 바꿔줌.
a[j]=b[i+j]=c[i-j+7]=false;
}
}
}
}
public static void main(String[] args) {
q8(0);
}
}
728x90
'기타 > java 자료구조와 알고리즘' 카테고리의 다른 글
자바 배열 선택정렬 (0) | 2021.01.07 |
---|---|
[JAVA] 버블 정렬 코드 예제 (0) | 2021.01.06 |
자바 재귀함수 하노이탑 풀이 (1) | 2021.01.04 |
재귀 알고리즘 비재귀로 표현하기 (0) | 2021.01.03 |
재귀 함수 알고리즘 예 하향식,상향식 분석하기 (0) | 2020.12.30 |