๐ค๋ฌธ์ ์ดํด
ํ๊ณผ ์ด, ๊ทธ๋ฆฌ๊ณ 3x3์ ์์ ์ฌ๊ฐํ ์์ 1~9๊น์ง์ ์๊ฐ ์ค๋ณต์์ด ๋์ค๊ฒ ๋ณด๋๋ฅผ ์ง๋ ๋ฌธ์ ์ด๋ค.
์กฐ๊ฑด
๋ณด๋ : 9 x 9
์๊ฐ : 2์ด
๋ฉ๋ชจ๋ฆฌ : 256MB
๐ฅํ์ด๐ฅ
๋ฐฑํธ๋ํน ๋ฐฉ์์ผ๋ก ๊ฐ์ด ๋น์ด์๋ ๋ถ๋ถ์ ๋ฃ์ ์ ์๋ ์ ์ค์์ ๊ฐ์ฅ ์์ ์๋ถํฐ ๋ฃ์ด๋ณด๋ฉด์ ์ฒ์์ผ๋ก ๋ณด๋๊ฐ ์ซ์๋ก ๋ค ์ฑ์์ง ์ ์์ ๋๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๋ณ์
- bool width[i][num] : i๋ฒ์งธ ํ์ num์ ์กด์ฌ ์ ๋ฌด
- bool length[i][num] : i๋ฒ์งธ ์ด์ num์ ์กด์ฌ ์ ๋ฌด
- bool square[i][num] : i๋ฒ์งธ ์ฌ๊ฐํ์ num์ ์กด์ฌ ์ ๋ฌด
- square์ ๊ฒฝ์ฐ ์ขํ๊ฐ (i, j)์ผ ๋ (i/3)*2 + (j/3)์ ๊ณ์ฐํ ๊ฐ์ด ๋ช๋ฒ์งธ ์ฌ๊ฐํ์ธ์ง ๋ํ๋ธ๋ค.
์ฌ๊ทํจ์ solve (int i, int j)
- ํ์ฌ ์ํ : ์ค๋์ฟ ๋ณด๋์์์ ํ์ฌ ์์น (i, j)
- ๋ค์ ์ํ : j+1์ด ๋ณด๋ ๋ด๋ถ์ด๋ฉด solve(i, j+1), ๊ทธ๋ ์ง ์์ผ๋ฉด solve(i+1, 0)
- ์ง์ ์ํ : ๋ณด๋์ ์ฒซ ์์น (0, 0)
- ์ข ๋ฃ ์ํ : ๋ณด๋์ ๋๊น์ง ์ซ์๋ก ๋ค ์ฑ์ด ๊ฒฝ์ฐ
ํจ์ vector<int> availableNumbers(int i, int j)
- (i, j)์ ๋ค์ด์ฌ ์ ์๋ ์ซ์๋ค์ ๋ฐํ
โํธ๋ฌ๋ธ ์ํ
์ฒ์์ i==9์ผ ๋ ์ฆ, ๋ณด๋๊ฐ ๋ค ์ฑ์์ก์ ๋ ์ถ๋ ฅํ๊ณ return์ ํด์คฌ๋๋ฐ ๊ทธ๋ ๊ฒ ๋๋ฉด ๊ฐ๋ฅํ ์ฌ๋ฌ ๋ต๋ค์ด ๋ค ์ถ๋ ฅ๋๊ฒ ๋์ด ์ถ๋ ฅ ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๊ทธ๋์ ๋ณด๋๊ฐ ์ฒ์์ผ๋ก ๋ค ์ฑ์์ง๋ฉด ์ฆ, ์ฌ๋ฌ ๋ต ์ค ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์ ๋ต์ ์ถ๋ ฅํ๊ณ ๋๋ฉด ํ๋ก๊ทธ๋จ ์์ฒด๋ฅผ ์ข ๋ฃ์ํค๋ exit(0); ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
โ๏ธ ํ๊ธฐ
์ฌ๊ทํจ์์ return ๋ถ๋ถ์ ์ ์ํด์ผ๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณด๋ ๋ด๋ถ์ ๋ค์ด๊ฐ ์ ์๋ ์๋ 1~9๊น์ง๋ก ๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด ์ฐ์ฐ์ด ๋ ๋นจ๋ผ์ง ๊ฒ ๊ฐ๋ค.
#include <iostream>
#include <vector>
using namespace std;
int map[10][10];
bool width[10][10];
bool length[10][10];
bool square[10][10];
string x;
vector<int> availNumbers(int i, int j) {
vector<int> tmp;
int idx = (i / 3) * 3 + j / 3;
for (int k = 1; k <= 9; k++) {
if (!width[i][k] && !length[j][k] && !square[idx][k]) {
tmp.push_back(k);
}
}
return tmp;
}
void printMap() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << map[i][j];
}
cout << "\n";
}
}
void solve(int i, int j) {
if (i == 9) {
printMap();
exit(0);
}
if (map[i][j] == 0) {
vector<int> tmp = availNumbers(i, j);
if (tmp.empty())
return;
for (int k = 0; k < tmp.size(); k++) {
int num = tmp[k];
int idx = (i / 3) * 3 + j / 3;
map[i][j] = num;
width[i][num] = true;
length[j][num] = true;
square[idx][num] = true;
if (j < 8)
solve(i, j + 1);
else
solve(i + 1, 0);
map[i][j] = 0;
width[i][num] = false;
length[j][num] = false;
square[idx][num] = false;
}
} else {
if (j < 8)
solve(i, j + 1);
else
solve(i + 1, 0);
}
}
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
for (int i = 0; i < 9; i++) {
cin >> x;
for (int j = 0; j < 9; j++) {
map[i][j] = x[j] - '0';
int num = map[i][j];
if (num != 0) {
width[i][num] = true;
length[j][num] = true;
int idx = (i / 3) * 3 + j / 3;
square[idx][num] = true;
}
}
}
solve(0, 0);
}
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 9663๋ฒ N-Queen (0) | 2022.08.16 |
---|---|
[๋ฐฑ์ค/C++] 16457๋ฒ ๋จํ์ ์ด์ผ๊ธฐ (0) | 2022.08.12 |
[๋ฐฑ์ค/C++] 1043๋ฒ ๊ฑฐ์ง๋ง (0) | 2022.07.26 |
[๋ฐฑ์ค/C++] 17143๋ฒ ๋์์ (0) | 2022.07.26 |
[๋ฐฑ์ค/C++] 1766๋ฒ ๋ฌธ์ ์ง (0) | 2022.07.21 |