본문 바로가기
알고리즘 문제풀이/백준

[백준 9663]N-Queen

by m2162003 2020. 11. 5.

www.acmicpc.net/problem/9663

 

9663번: N-Queen

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

www.acmicpc.net

평소에 푸는 방법과 다른 풀이방법을 알아냈다.

각 row당 queen은 한개만 존재해야하므로 row는 무조건 1씩 증가한다.

col과 왼쪽 오른쪽 대각선을 고려해주는데

왼쪽 대각선을 보면 각 대각선의 row + col 좌표 합이 일정함을 알 수 있다. 오른쪽 대각선은 row-col이 일정함

이 때 row-col은 음수이므로 offset처리를 해줘야 해서 n-1을 더해준다.

 

// 대각선을 사용하자
#include <stdio.h>

using namespace std;

int answer;
int n;
bool col[15];
bool left[30];
bool right[30];
void dfs(int x, int y)
{
  //만약 이미 있다면 return
  if (col[y] || left[x + y] || right[x - y + n - 1])
  {
    return;
  }

  if (x == n - 1)
  {
    answer++;
    return;
  }

  col[y] = 1;
  left[x + y] = 1;
  right[x - y + n - 1] = 1;
  for (int i = 0; i < n; i++)
  {
    dfs(x + 1, i);
  }
  col[y] = 0;
  left[x + y] = 0;
  right[x - y + n - 1] = 0;
}

int main(void)
{
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    dfs(0, i);
  }
  printf("%d\n", answer);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 14891] 톱니바퀴  (0) 2020.11.07
[백준 1182] 부분수열의 합  (0) 2020.11.05
[백준 13335] 트럭  (0) 2020.11.04
[백준 13913] 숨바꼭질 4  (0) 2020.11.01
[백준 13549] 숨바꼭질3  (0) 2020.10.29

댓글