백준

백준 9663 C++

solfa 2023. 11. 23. 18:18

https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

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

www.acmicpc.net

 

퀸이 서로 공격할 수 없게 놓는 방법 : 같은 행 / 같은 열 / 같은 대각선 상에 위치하지 않아야 한다.

 

(최지웅 교수님한테 배운 ㅎ) 생각
1. 백트래킹 문제니까 되추적 알고리즘을 쓴다
 1.1. 상태 조건 트리를 어떻게 구성할 것인가? -> 트리까지 그릴 필요는 없는 문제인듯 아닌가 하하
 1.2. promising 조건을 뭘로 할 것인가? -> 행 / 열 / 대각선이 겹치는지 확인하기

 

1차원 배열을 써도 되는 이유

그림을 그려보자... ㅜㅜ

#include <iostream>
using namespace std;

int N, cnt=0;
int col[15];

void queens(int i);
bool promising(int i);

int main()
{
    cin >> N;
    queens(0); // queens(N)이라는 멍청한 짓 하지 말기....................
    cout << cnt;
}

void queens(int i)
{
        if (i == N)
        {
            cnt++;
        }
            for (int j = 0; j < N; j++)
            {
                col[i] = j; // col[0] = 0 / 1 / 2 / 3 ... 을 promising에서 k와 비교
                
                if(promising(i)){ // 유망하면(true) / 유망하지 않으면(false)
                    queens(i + 1);
                }
            }
}

bool promising(int i)
{
    for(int k=0 ; k<i ; k++){
        if (col[i] == col[k] || abs(col[i] - col[k]) == abs(i - k))
        {
            return false;
        }
    }
    return true;
}
728x90

'백준' 카테고리의 다른 글

백준 1182 C++  (1) 2023.11.26
백준 15649 C++  (0) 2023.11.24
백준 2231 C++  (2) 2023.11.22
백준 7568 C++  (2) 2023.11.22
백준 1018 C++  (0) 2023.11.18