๋ฐฑ์ค€/C++

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

yulee_to 2022. 8. 16. 20:26

๋ฐฑ์ค€

 


๐Ÿค”๋ฌธ์ œ ์ดํ•ด

ํ€ธ์€ ์ž์‹ ์ด ์œ„์น˜ํ•œ ํ–‰๊ณผ ์—ด, ๊ทธ๋ฆฌ๊ณ  ์–‘์ชฝ ๋Œ€๊ฐ์„ ์„ ๋‹ค ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ€ธ์ด ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋Š” ๊ณต๊ฐ„์— ๋˜ ๋‹ค๋ฅธ ํ€ธ์„ ๋†“์œผ๋ฉฐ N๊ฐœ์˜ ํ€ธ์„ ๋ชจ๋‘ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ฒด์Šค๋ฅผ ๋ชฐ๋ผ์„œ ๋”ฐ๋กœ ๊ฒ€์ƒ‰ํ•ด๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.(๋ฌธ์ œ๊ฐ€ ๋ถˆ์นœ์ ˆ..)


๐Ÿ”ฅํ’€์ด๐Ÿ”ฅ

ํ•œ ํ–‰์—์„œ ํ€ธ์„ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ์—ด์— ํ€ธ์„ ๋†“์•„๋ณด๊ณ  ๊ทธ ๋•Œ์˜ ๊ณต๊ฒฉ๋ฒ”์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์คฌ๋‹ค๊ฐ€ ๋ฆฌํ„ดํ•˜๋ฉด ๊ณต๊ฒฉ๋ฒ”์œ„๋ฅผ ๊ทธ ์ „์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  ํ•ด๋‹น ํ–‰์—์„œ ๋‹ค์Œ ๊ฐ€๋Šฅํ•œ ์—ด์— ๋‘๋Š” ๊ฒฝ์šฐ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

๋ณ€์ˆ˜

- length : ํ€ธ์ด ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ด์˜ ์œ„์น˜๋ฅผ ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ํ‘œํ˜„

- diag1 : ํ€ธ์ด ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅธ์ชฝ์œ„๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์„ ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ํ‘œํ˜„

- diag2 : ํ€ธ์ด ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์™ผ์ชฝ์œ„๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์„ ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ํ‘œํ˜„

 

์žฌ๊ท€ํ•จ์ˆ˜ void Solve(int i, int cnt) 

- ํ˜„์žฌ ์ƒํƒœ : ํ€ธ์„ ๋†“์„ i๋ฒˆ์งธ ํ–‰๊ณผ ๋†“์—ฌ์ง„ ํ€ธ์˜ ๊ฐฏ์ˆ˜ cnt

- ๋‹ค์Œ ์ƒํƒœ : ๋‹ค์Œ ํ–‰

- ์ง„์ž… ์ƒํƒœ : 0๋ฒˆ์งธ ํ–‰, 0๊ฐœ์˜ ํ€ธ

- ์ข…๋ฃŒ ์ƒํƒœ : ํ€ธ์ด n๊ฐœ ๋†“์˜€์„ ๋•Œ return 

- ํ€ธ์ด ๋†“์ด๋ฉด ๊ณต๊ฒฉ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” length, diag1, diag2์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ

 

ํ•จ์ˆ˜ vector<int> AvailableNum() 

- ํ˜„์žฌ ํ–‰์—์„œ ํ€ธ์„ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ์—ด์˜ ์ขŒํ‘œ๋ฅผ ๋‹ด์€ ๋ฒกํ„ฐ๋ฅผ return

 

โœ๏ธ ํ›„๊ธฐ

ํ•œ ํ–‰์—๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜๋งŒ ๋‘˜ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ ํ–‰์— ํ€ธ์„ ํ•˜๋‚˜๋‘๋ฉด ๋ฐ”๋กœ ๋‹ค์Œ ํ–‰์œผ๋กœ ๋„˜์–ด๊ฐ€์•ผ ํ–ˆ๋‹ค..! ๋ณด๋“œ์˜ ๋ชจ๋“  ์นธ์„ ๋‹ค ๋Œ๊ฒŒ ๋˜๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ๋ฐ–์— ใ… 


#include <iostream>
#include <vector>

using namespace std;

int n;
int length, diag1, diag2;
int ans;

bool isValid(int i, int j) {
    if ((diag1 & (1 << (i + j))) != 0) return false;
    if (i - j > 0) {
        i = i - j;
        j = 0;
    } else {
        j = j - i;
        i = 0;
    }

    if (i == 0) {
        if ((diag2 & (1 << (j + n))) != 0) return false;
    } else if (j == 0) {
        if ((diag2 & (1 << i)) != 0) return false;
    }
    return true;
}

vector<int> AvailableNum() {
    vector<int> tmp;
    for (int j = 0; j < n; j++) {
        if ((length & (1 << j)) == 0)
            tmp.push_back(j);
    }
    return tmp;
}

void Solve(int i, int cnt) {
    if (cnt == n) {
        ans++;
        return;
    }
    if (i == n) return;
    int tmp_length = length;
    int tmp_diag1 = diag1;
    int tmp_diag2 = diag2;

    vector<int> x = AvailableNum();
    for (int j: x) {
        if (isValid(i, j)) {
            length = length | (1 << j);
            diag1 = diag1 | (1 << (i + j));
            int ni = i;
            int nj = j;
            if (ni - nj > 0) {
                ni = ni - nj;
                nj = 0;
            } else {
                nj = nj - ni;
                ni = 0;
            }
            if (ni == 0)
                diag2 = diag2 | (1 << (nj + n));
            else
                diag2 = diag2 | (1 << ni);

            Solve(i + 1, cnt + 1);

            length = tmp_length;
            diag1 = tmp_diag1;
            diag2 = tmp_diag2;
        }
    }
}

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n;
    Solve(0, 0);
    cout << ans;
}
728x90