C언어/문제풀다 하나씩

Nqueen문제 (백준 9663 N-Queen & 코드업 3520 체커도전 문제)

mcdn 2021. 1. 19. 17:02
반응형

www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

N-Queen 성공분류

시간 제한메모리 제한제출정답맞은 사람정답 비율

10 초 128 MB 32140 17417 11439 53.788%

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

예제 입력 1 복사

8

예제 출력 1 복사

92

#include <iostream>
using namespace std;

int board[16];
int cnt;

void	print_board(int n)
{
	for (int i = 0; i < n; i++)
		cout << board[i] << " ";
	cout << "\n";
}

int		is_attackable(int lev, int n)
{
	int nowy = board[lev];
	int nowx = lev;

	//print_board(n);
	for (int i = 0; i < lev; i++)
	{
		if (board[i] == nowy)
			return (1);
		if ((board[i] + i) == (nowy + nowx))
			return (1);
		if ((board[i] - i) == (nowy - nowx))
			return (1);
	}
	return (0);
}

void	nqueen(int lev, int n)
{

	if (lev == n)
	{
		cnt++;
		return ;
	}
	for (int i = 0; i < n; i++)
	{
		board[lev] = i;
		if (is_attackable(lev, n) == 0)
			nqueen(lev + 1, n);
	}
}

int main(void)
{
	int n;
	cin >> n;

	for (int i = 0; i < n; i++)
		board[i] = -1;
	cnt = 0;
	nqueen(0, n);
	cout << cnt;
}

www.codeup.kr/problem.php?id=3520

 

체커 도전 (N-Queen Problem)

체스에서 퀸(queen)은 가로, 세로, 대각선에 같은 퀸을 배치하지 못한다. 각 체커는 각 행에 1개, 각 열에 1개씩 밖에 배치할 수 없다.  6*6체커보드에서 6개의 체커들은 다음과 같이 퀸을 배치할 수

www.codeup.kr

문제 설명    내 문제집에 추가 내소스1

체스에서 퀸(queen)은 가로, 세로, 대각선에 같은 퀸을 배치하지 못한다.

각 체커는 각 행에 1개, 각 열에 1개씩 밖에 배치할 수 없다. 

6*6체커보드에서 6개의 체커들은 다음과 같이 퀸을 배치할 수 있다.

 

이 상태의 열 번호는 2 4 6 1 3 5로 나타낼 수 있다.

체스판의 크기가 N이 주어질 때, 퀸을 놓을 수 있는 모든 배치의 개수를 구하시오.

입력

체스판의 크기 N이 입력된다( 6 <= N <= 13 )

출력

처음 세 줄은 가능한 해법 3가지를 출력한다. 이때 열번호가 적은 순서부터 오름차순으로 세 가지만 출력한다.

네째 줄에 가능한 퀸의 배치 개수를 출력한다.

입력 예시   예시 복사

6

출력 예시

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4

 

#include <iostream>
using namespace std;

int board[16];
int cnt;
int ptnum;

void	print_board(int n)
{
	for (int i = 0; i < n; i++)
		cout << board[i] + 1 << " ";
	cout << "\n";
}

int		is_attackable(int lev, int n)
{
	int nowy = board[lev];
	int nowx = lev;

	for (int i = 0; i < lev; i++)
	{
		if (board[i] == nowy)
			return (1);
		if ((board[i] + i) == (nowy + nowx))
			return (1);
		if ((board[i] - i) == (nowy - nowx))
			return (1);
	}
	return (0);
}

void	nqueen(int lev, int n)
{

	if (lev == n)
	{
		cnt++;
		if (ptnum-- > 0)
			print_board(n);
		return ;
	}
	for (int i = 0; i < n; i++)
	{
		board[lev] = i;
		if (is_attackable(lev, n) == 0)
			nqueen(lev + 1, n);
	}
}

int main(void)
{
	int n;
	cin >> n;

	ptnum = 3;
	cnt = 0;
	nqueen(0, n);
	cout << cnt;
}

 print board  function used here!!

 

 

 

반응형