[C言語]Baekjun 9663:N-Queen
潮流
n開皇后を知る方法を知っている.
https://www.youtube.com/watch?v=ltm-JX5R1pA&ab_channel=%EC%BD%94%EB%94%A9%EB%9E%A9CodingLab
ここで一度説明を聞いて、クローンコードをしてみて、デバッグするときに先に理解しました.
それから見ないで、もう一度やってみて、デバッグして直しました.わかりました.
私が混同した部分と論理を注釈で書きます.
#include <stdio.h>
int vx[16], vy[16];
int ft_abs(int a, int b)
{
if (a - b >= 0)
return a - b;
else
return (a - b) * - 1;
}
int n_queen(int x, int y, int n)
{
int i;
i = 0;
while (i < y) // 백트래킹을 위한 반복문
// 왜 i < y일까? 우리는 main에서 x좌표를 기준잡고 올렸다. 그리고 재귀로
// x좌표에 i, 즉 1씩 증가하고, y좌표는 고정되어있다.(+ 1만큼만)
// 그렇기에 y좌표까지만 고정하고, x좌표를 이동시키면서 진행시킨다.
// 이해가 안된다면 디버깅을 n = 4로잡고 다시 해보자.
{
if (y == vy[i]) // y좌표가 같을경우 가지치기
return 0;
if (x == vx[i]) // x좌표가 같을경우 가지치기
return 0;
if (ft_abs(x, vx[i]) == ft_abs(y, vy[i])) // 대각선이 같을경우 가지치기
return 0;
i++;
}
if (y == n - 1) // 좌표는 0부터 시작하기에 n - 1까지 세준다.
return 1;
vx[y] = x; // 왜 vx[y]일까? 위에서 말했듯 y는 고정시켜야 한다.
// vx[1] = 2, vy[1] = 1 이라고 하면, 두번째줄에 좌표가 2,1에 퀸을 놓는다는 의미.
vy[y] = y;
int count = 0;
i = 0;
while (i < n)
{
count = count + n_queen(i, y + 1, n);
i++;
}
return count;
}
int main()
{
int i, n;
int count = 0;
scanf("%d", &n);
i = 0;
while (i < n)
{
count = count + n_queen(i, 0, n);
i++;
}
printf("%d", count);
}
Reference
この問題について([C言語]Baekjun 9663:N-Queen), 我々は、より多くの情報をここで見つけました https://velog.io/@kimmainsain/C언어-백준-9663-N-Queenテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol