https://www.acmicpc.net/problem/2580
๋ฌธ์
์ค๋์ฟ ๋ 18์ธ๊ธฐ ์ค์์ค ์ํ์๊ฐ ๋ง๋ '๋ผํด ์ฌ๊ฐํ'์ด๋ ํผ์ฆ์์ ์ ๋ํ ๊ฒ์ผ๋ก ํ์ฌ ๋ง์ ์ธ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์๋ค. ์ด ๊ฒ์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ๋ก, ์ธ๋ก ๊ฐ๊ฐ 9๊ฐ์ฉ ์ด 81๊ฐ์ ์์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์ฌ๊ฐํ ํ ์์์ ์ด๋ค์ง๋๋ฐ, ๊ฒ์ ์์ ์ ์ผ๋ถ ์นธ์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์ ์ค ํ๋๊ฐ ์ฐ์ฌ ์๋ค.
๋๋จธ์ง ๋น ์นธ์ ์ฑ์ฐ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๊ฐ์ ๊ฐ๋ก์ค๊ณผ ์ธ๋ก์ค์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
- ๊ตต์ ์ ์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ 3x3 ์ ์ฌ๊ฐํ ์์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
์์ ์์ ๊ฒฝ์ฐ, ์ฒซ์งธ ์ค์๋ 1์ ์ ์ธํ ๋๋จธ์ง 2๋ถํฐ 9๊น์ง์ ์ซ์๋ค์ด ์ด๋ฏธ ๋ํ๋ ์์ผ๋ฏ๋ก ์ฒซ์งธ ์ค ๋น์นธ์๋ 1์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
๋ํ ์์ชฝ ๊ฐ์ด๋ฐ ์์นํ 3x3 ์ ์ฌ๊ฐํ์ ๊ฒฝ์ฐ์๋ 3์ ์ ์ธํ ๋๋จธ์ง ์ซ์๋ค์ด ์ด๋ฏธ ์ฐ์ฌ์์ผ๋ฏ๋ก ๊ฐ์ด๋ฐ ๋น ์นธ์๋ 3์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
์ด์ ๊ฐ์ด ๋น ์นธ์ ์ฐจ๋ก๋ก ์ฑ์ ๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๊ฒ์ ์์ ์ ์ค๋์ฟ ํ์ ์ฐ์ฌ ์๋ ์ซ์๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋ ๋ชจ๋ ๋น ์นธ์ด ์ฑ์์ง ์ต์ข ๋ชจ์ต์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ํ ์ค์ ๊ฑธ์ณ ํ ์ค์ 9๊ฐ์ฉ ๊ฒ์ ์์ ์ ์ค๋์ฟ ํ ๊ฐ ์ค์ ์ฐ์ฌ ์๋ ์ซ์๊ฐ ํ ์นธ์ฉ ๋์์ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ์ค๋์ฟ ํ์ ๋น ์นธ์ ๊ฒฝ์ฐ์๋ 0์ด ์ฃผ์ด์ง๋ค. ์ค๋์ฟ ํ์ ๊ท์น๋๋ก ์ฑ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์ ๋ ฅ์ ์ฃผ์ด์ง์ง ์๋๋ค.
์ถ๋ ฅ
๋ชจ๋ ๋น ์นธ์ด ์ฑ์์ง ์ค๋์ฟ ํ์ ์ต์ข ๋ชจ์ต์ ์ํ ์ค์ ๊ฑธ์ณ ํ ์ค์ 9๊ฐ์ฉ ํ ์นธ์ฉ ๋์์ ์ถ๋ ฅํ๋ค.
์ค๋์ฟ ํ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฟ์ธ ๊ฒฝ์ฐ๋ ๊ทธ ์ค ํ๋๋ง์ ์ถ๋ ฅํ๋ค.
์ ํ
- 12095๋ฒ ๋ฌธ์ ์ ์๋ ์์ค๋ก ํ ์ ์๋ ์
๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
- C++14: 80ms
- Java: 292ms
- PyPy3: 1172ms
ํ์ด
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> ci;
vector<vector<int>> board(9, vector<int>(9,0));
vector<ci> blank; // ๋น ์นธ์ ์ขํ ์ ๋ณด๋ค
int blankNum;
bool row[10][10]; // col[x][y] = x๋ฒ์งธ ์ด์ y๋ผ๋ ์ซ์๊ฐ ์๋๊ฐ?
bool col[10][10];
bool box[10][10];
bool isFound = false;
void sudoku(int index) {
if(index == blankNum) {
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++)
cout << board[i][j] << " ";
cout << "\n";
}
isFound = true;
return;
}
ci curPos = blank[index];
int x = curPos.first;
int y = curPos.second;
for(int i=1; i<=9; i++) {
if(row[x][i] || col[y][i] || box[(x/3)*3+(y/3)][i])
continue;
if(isFound)
return;
board[x][y] = i;
row[x][i] = col[y][i] = box[(x/3)*3+(y/3)][i] = true;
sudoku(index+1);
row[x][i] = col[y][i] = box[(x/3)*3+(y/3)][i] = false;
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
// ์ด๊ธฐํ
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
box[i][j] = col[i][j] = box[i][j] = false;
// ์
๋ ฅ
int input;
for(int i=0; i<9; i++) {
for(int j=0; j<9; j++) {
cin >> input;
if(input==0)
blank.push_back({i,j});
board[i][j] = input;
row[i][input] = true;
col[j][input] = true;
box[(i/3)*3+(j/3)][input] = true;
}
}
blankNum = blank.size();
// ์ฐ์ฐ
sudoku(0);
return 0;
}
/*
*/
'๐๏ธ ICPC Sinchon > Backtracking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 14888๋ฒ: ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2023.07.06 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 15811๋ฒ: ๋ณต๋ฉด์ฐ?! (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 2661๋ฒ: ์ข์์์ด (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 23304๋ฒ: ์์นด๋ผ์นด (0) | 2023.01.21 |
[BOJ S2][C++] ๋ฐฑ์ค 10971๋ฒ: ์ธํ์ ์ํ 2 (0) | 2022.09.27 |