๐ค๋ฌธ์ ์ดํด
ํธ์ ์์ ์ด ์์นํ ํ๊ณผ ์ด, ๊ทธ๋ฆฌ๊ณ ์์ชฝ ๋๊ฐ์ ์ ๋ค ๊ณต๊ฒฉํ ์ ์์ผ๋ฏ๋ก ํธ์ด ๊ณต๊ฒฉํ ์ ์๋ ๊ณต๊ฐ์ ๋ ๋ค๋ฅธ ํธ์ ๋์ผ๋ฉฐ 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;
}
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 21610๋ฒ ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ (0) | 2022.10.06 |
---|---|
[๋ฐฑ์ค/C++] 24524๋ฒ ์๋ฆ๋ค์ด ๋ฌธ์์ด (0) | 2022.10.05 |
[๋ฐฑ์ค/C++] 16457๋ฒ ๋จํ์ ์ด์ผ๊ธฐ (0) | 2022.08.12 |
[๋ฐฑ์ค/C++] 2239๋ฒ ์ค๋์ฟ (0) | 2022.08.11 |
[๋ฐฑ์ค/C++] 1043๋ฒ ๊ฑฐ์ง๋ง (0) | 2022.07.26 |