본문 바로가기

삼성전자 알고리즘/정올

8. 1889 : N Queen [DFS]

문제 출처 : http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1162&sca=50&sfl=wr_subject&stx=queen&sop=and

 

JUNGOL | N Queen > 문제은행

제한시간: 1000 ms    메모리제한: 64 MB 해결횟수: 2500 회    시도횟수: 7257 회    체스에서 queen의 가로, 세로, 대각선 방향으로 어느 곳이나 한 번에 움직일 수 있다. 즉 다음과 같은 체스판에서 queen이 X라고 표시된 위치에 있을 때,  그 다음 queen이 움직여 갈수 있는 부분은 어둡게 칠해진 부분 중의 하나이다. N X N 크기의 정방형 체스판이 주어졌다.  우리는 거기에 N개의 queen을 배치하려고 하는데,

jungol.co.kr

문제 풀이 :

#include <stdio.h>
int chess[13 + 10][13 + 10];
int N;
int sol = 0;
int check(int y, int x) {
	int i, j;
	for (i = 0; i < y; i++) if (chess[i][x] == 1) return 0;
	for (i = y - 1, j = x + 1; ((i >= 0) && (j < N)); i--, j++)if (chess[i][j] == 1)return 0;
	for (i = y - 1, j = x - 1; ((i >= 0) && (j >= 0)); i--, j--)if (chess[i][j] == 1) return 0;

	return 1;
}
void N_Queen(int y) {
	int j;
	if (y >= N) { sol++; return; }
	for (j = 0; j < N; j++) {
		if (check(y, j) == 1) {
			chess[y][j] = 1;    //재귀 호출 전 set
			N_Queen(y + 1);
			chess[y][j] = 0;    //재귀 호출 후 clear
		}
	}
}
int main() {
	scanf("%d", &N);
	N_Queen(0);
	printf("%d\n", sol);
}

 

일단 배치한 뒤 조건이 만족 안되면 백트래킹을 해가면서 마지막으로 배치 성공한 부분부터 다시 시작한다.

'삼성전자 알고리즘 > 정올' 카테고리의 다른 글

10. 2788 : 도약  (0) 2019.06.16
9. 2581 : 예산  (0) 2019.06.16
7. 1169 : 주사위 던지기1[DFS]  (0) 2019.06.16
5. 1078 : 저글링 방사능 오염  (0) 2019.06.16
4. 1661 : 미로 탈출 로봇  (0) 2019.06.16