반응형
www.acmicpc.net/problem/9663
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
문제 설명 내 문제집에 추가 내소스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!!
반응형
'C언어 > 문제풀다 하나씩' 카테고리의 다른 글
코드업 3707 합의 개수 : 중복조합 nHr로 푼 문제 (0) | 2021.01.27 |
---|---|
백준 15666 n과 m (12) 헷갈렸다.. prev != arr[i] (0) | 2021.01.25 |
다이나믹 프로그래밍 문제 백준 2579 계단 오르기 문제 d[i][1] d[i][2] (0) | 2021.01.21 |
백준 2309번 일곱난쟁이 || 코드업 codeup 3008 일곱 난쟁이 (0) | 2021.01.20 |
Codeup 코드업 2641 숏다리의 계단 오르기 small (0) | 2021.01.18 |
백준 15663 n 과 m 9번 (0) | 2021.01.18 |
1182 백준 부분집합의 합 (0) | 2021.01.16 |
디폴트 생성자 Queue() : {} (0) | 2020.08.12 |