๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 9663 : N-Queen (์™„์ „ํƒ์ƒ‰, Backtracking)

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

๋ฌธ์ œ

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N × N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N < 15)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


 

 

๋ฌธ์ œ ํžŒํŠธ์— ํ€ธ์˜ Show must go on ๋…ธ๋ž˜๊ฐ€ ์žˆ๊ธธ๋ž˜ ์‹ ๋‚˜๊ฒŒ ๋“ค์œผ๋ฉด์„œ ํ’€์—ˆ์Œ

 

๋ฐฑ์ค€ ํ‹ฐ์–ด ๊ณจ๋“œ4, ์™„์ „ํƒ์ƒ‰ + ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์ด๋‹ค.

 

์ฒ˜์Œ์— ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€๊ธด ํ’€์—ˆ์ง€๋งŒ ์žฌ๊ท€ ๊ณผ์ •์ด ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์—ˆ๋Š”๋ฐ,

์–ด๋–ค ๋™์˜์ƒ์˜ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๊ณ  ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค.

์žฌ๊ท€์˜ ํ๋ฆ„๊ณผ ๋Š๊น€์„ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฆผ์ด๋‹ค!

 

์ถœ์ฒ˜ : https://www.youtube.com/watch?v=ltm-JX5R1pA&ab_channel=%EC%BD%94%EB%94%A9%EB%9E%A9CodingLab

 

main ideas

 

1. ์–ด์ฐจํ”ผ matrix๋กœ ๋‘์–ด๋„ ๊ฐ™์€ ํ–‰๊ณผ ์—ด์—๋Š” ํ€ธ์„ ๋ชป ๋‘๋ฏ€๋กœ ์ด์ฐจ์›๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ ์ผ์ฐจ์› ๋ฐฐ์—ด๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. 

 

2. ํ€ธ์ด ์žˆ๋Š” ๊ณณ๊ณผ ๊ฐ™์€ ํ–‰, ๊ฐ™์€ ์—ด, ๋Œ€๊ฐ์„ ์—๋Š” ๋‹ค๋ฅธ ํ€ธ์„ ๋†“์ง€ ๋ชปํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ผ์ฐจ์› ๋ฐฐ์—ด์˜ i ๋ฒˆ์งธ ์—ด์— ํ€ธ์„ ๋†“๊ณ , ์—ด์ด ๊ฒน์น˜๊ฑฐ๋‚˜ ๋Œ€๊ฐ์„ ์— ์žˆ๋‹ค๋ฉด ์ค‘์ง€ํ•œ๋‹ค. (backtracking)

์ด๋•Œ, ๋Œ€๊ฐ์„  ํ™•์ธ์€ (x,y) (x+1,y+1) ์ด ๋Œ€๊ฐ์„ (๊ธฐ์šธ๊ธฐ๊ฐ€ 1)์ž„์„ ์ด์šฉํ•œ๋‹ค. (x๋ผ๋ฆฌ์˜ ์ฐจ == y๋ผ๋ฆฌ์˜ ์ฐจ)

 

3. canGo() ์—์„œ true๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด, ๊ทธ ๋‹ค์Œ ํ–‰์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

๋†“์€ ํ€ธ์˜ ๊ฐฏ์ˆ˜๊ฐ€ n๊ฐœ๊ฐ€ ๋˜๋ฉด answer์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
using namespace std;

int n;
int line[15] = {0};
int answer = 0;

bool canGo(int x){
    for (int i = 0; i < x; ++i){
        if(line[x] == line[i]) return false; // y๊ฐ’์ด ๊ฐ™๋‹ค?(๊ฐ™์€ ์—ด์ด๋‹ค?) false
        if(abs(line[x]-line[i]) == x-i) return false; // ๋Œ€๊ฐ์„  ๋ผ์ธ์ด๋‹ค? false
    }
    return true;
}

void queen(int x){
    if(x==n) {
        answer++;
    }
    else{
        for (int i = 0; i < n; ++i){
            line[x] = i; // xํ–‰์˜ i๋ฒˆ์งธ ์—ด์— ํ€ธ ๋†“๊ธฐ
            if(canGo(x)) queen(x + 1);
        }
    }
}

int main(){
    cin >> n;
    queen(0);
    cout << answer;
    return 0;
}