๐Ÿ• Baaaaaarking/0x0C๊ฐ• - ๋ฐฑํŠธ๋ž˜ํ‚น

[BOJ G4][C++] ๋ฐฑ์ค€ 9663๋ฒˆ: N-Queen

์„ ๋‹ฌ 2022. 7. 6. 05:56
๋ฐ˜์‘ํ˜•

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

 

9663๋ฒˆ: N-Queen

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

www.acmicpc.net

 

๋ฌธ์ œ

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

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

์ž…๋ ฅ

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

์ถœ๋ ฅ

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

 

ํ’€์ด

์ขŒํ‘œ๋ฅผ (r,c) ๋ผ๊ณ  ๋‘”๋‹ค.

col[x] : x๋ฒˆ์งธ ์—ด์— ํ€ธ์˜ ์—ฌ๋ถ€
increase[x] : i+k=x ์ธ ์šฐ์ƒํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์˜ ์—ฌ๋ถ€
decrease[x] : i-k+(n-1) = x ์ธ ์šฐํ•˜ํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์˜ ์—ฌ๋ถ€

(์ด๋•Œ ์ธ๋ฑ์Šค๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด n-1์„ ๋”ํ–ˆ๋‹ค)

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int n, ans;
bool col[15];
bool increase[30];
bool decrease[30];

void recur(int r) {
    if(r == n) {
        ans++;
        return;
    }
    
    for(int c=0; c<n; c++) {
        if(col[c] || increase[r+c] || decrease[n+r-c])
            continue;
            
        col[c] = increase[r+c] = decrease[n+r-c] = true;
        recur(r+1);
        col[c] = increase[r+c] = decrease[n+r-c] = false;
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    
    cin >> n;
    
    recur(0);
    
    cout << ans;
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•