반응형
문제링크:www.acmicpc.net/problem/2239
2239번: 스도쿠
스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다
www.acmicpc.net
일반적인 스도쿠문제와 동일합니다.
다만, "제일 작은 경우를 출력한다." 라는 조건이 추가됐습니다.
아래 링크와 같은 방법으로 해결해도 됩니다.
[백준] 2580-스도쿠(C++)
문제링크:https://www.acmicpc.net/problem/2580 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같
gusdnr69.tistory.com
저는 직관적인 방법으로 결과를 도출했습니다.
아래는 정답 코드 입니다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int arr[9][9] = { 0, };
bool fin = false;
vector <pair <int, int>> zero_vec;
void dfs(int cnt) {
if (cnt == zero_vec.size()) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++)
cout << arr[i][j];
cout << endl;
}
fin = true;
return;
}
if (fin == true)
return;
for(int i=cnt;i<zero_vec.size();i++){}
int y = zero_vec[cnt].first;
int x = zero_vec[cnt].second;
bool temp[10] = { 0, };
for (int i = 0; i < 9; i++) {
temp[arr[y][i]] = 1;
temp[arr[i][x]] = 1;
}
for (int i = y / 3 * 3; i < y / 3 * 3 + 3; i++)
for (int j = x / 3 * 3; j < x / 3 * 3 + 3; j++)
temp[arr[i][j]] = 1;
for (int i = 1; i <= 9; i++)
if (temp[i] == 0) {
arr[y][x] = i;
dfs(cnt + 1);
arr[y][x] = 0;
}
}
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
for (int i = 0; i < 9; i++) {
string temp;
cin >> temp;
for (int j = 0; j < 9; j++) {
arr[i][j] = temp[j] - '0';
if (arr[i][j] == 0)
zero_vec.push_back(make_pair(i, j));
}
}
dfs(0);
return 0;
}
반응형
'알고리즘 > DFS' 카테고리의 다른 글
[백준] 3980-선발 명단(C++) (0) | 2021.01.24 |
---|---|
[백준] 16197-두 동전(C++) (0) | 2021.01.23 |
[백준] 1799-비숍(C++) (0) | 2021.01.19 |
[백준] 15918-랭퍼든 수열쟁이야!!!(C++) (0) | 2021.01.19 |
[백준] 20208-진우의 민트초코우유(C++) (0) | 2021.01.17 |