์๊ณ ๋ฆฌ์ฆ
๋ฐฑ์ค_2580_์ค๋์ฟ
shj718
2022. 5. 4. 14:06
๐๋ฌธ์ : https://www.acmicpc.net/problem/2580
2580๋ฒ: ์ค๋์ฟ
์ค๋์ฟ ๋ 18์ธ๊ธฐ ์ค์์ค ์ํ์๊ฐ ๋ง๋ '๋ผํด ์ฌ๊ฐํ'์ด๋ ํผ์ฆ์์ ์ ๋ํ ๊ฒ์ผ๋ก ํ์ฌ ๋ง์ ์ธ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์๋ค. ์ด ๊ฒ์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ๋ก, ์ธ๋ก ๊ฐ๊ฐ 9๊ฐ์ฉ ์ด 81๊ฐ์ ์์ ์นธ์ผ๋ก ์ด๋ฃจ
www.acmicpc.net
๐์๊ณ ๋ฆฌ์ฆ: ๋ฐฑํธ๋ํน (์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน์ผ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ก ์ฃผ์ด์ ธ์ ๋ฐฑํธ๋ํน์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ)
๐์์ด๋์ด: N-Queen ๋ฌธ์ ์ ์ ์ฌํ๊ฒ boolํ ๋ฐฐ์ด ํ์ฉ
+ exit(0) : ํ๋ก๊ทธ๋จ์ ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ. (์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์ํ๋ ๊ฐ์ด ๋์์ ๊ฒฝ์ฐ ๋ฐ๋ก ์ข ๋ฃํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉ)
๐์ฝ๋:
#include <iostream>
using namespace std;
int board[9][9];
bool row[9][10];
bool col[9][10];
bool square[9][10];
// ํ, ์ด, ๋๊ฐ์ ์ ๋ํด์ boolํ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ํด๋น ์ซ์๊ฐ ์์ผ๋ฉด true๋ฅผ ์ ์ฅ.
int getSquare(int x, int y) {
return (x / 3) * 3 + (y / 3);
}
void solve(int n) { // n๋ฒ์งธ ์นธ = xํ * 9 + y์ด
// ์ฑ๊ณตํ ๊ฒฝ์ฐ
if (n == 81) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << board[i][j] << ' ';
}
cout << '\n';
}
exit(0);
}
// ๋ค์ ํธ์ถ (์กฐ๊ฑด ๊ฒ์ฌ)
int x = n / 9;
int y = n % 9;
if (board[x][y] != 0) { // ๋น์นธ์ด ์๋๋ผ๋ฉด ๋ค์ ์นธ์ผ๋ก ๋์ด๊ฐ๊ธฐ
solve(n + 1);
}
else { // ๋น์นธ์ด๋ผ๋ฉด
for (int i = 1; i <= 9; i++) {
if (row[x][i] == false && col[y][i] == false && square[getSquare(x, y)][i] == false) { // ์กฐ๊ฑด ๊ฒ์ฌ
// ํธ์ถ ์ ์ค๋น
row[x][i] = col[y][i] = square[getSquare(x, y)][i] = true;
board[x][y] = i;
// ํธ์ถ
solve(n + 1);
// ํธ์ถ ํ ๋ณต๊ตฌ
row[x][i] = col[y][i] = square[getSquare(x, y)][i] = false;
board[x][y] = 0;
}
}
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> board[i][j];
row[i][board[i][j]] = true;
col[j][board[i][j]] = true;
square[getSquare(i, j)][board[i][j]] = true;
}
}
solve(0);
return 0;
}