2239 c++ - 스도쿠
2024. 10. 31. 15:50ㆍ🐣/BOJ
간단한 백트래킹 문제이다. queue를 사용해서 0의 좌표값들을 저장해서 사용했는데, 이런식으로는 처음 사용해봐서 애를 좀 먹었다.
/* ************************************************************************** */
/* */
/* ::: ::: ::: */
/* Problem Number: 2239 :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: chanhihi <boj.kr/u/chanhihi> +#+ +#+ +#+ */
/* +#+ +#+ +#+ */
/* https://boj.kr/2239 #+# #+# #+# */
/* Solved: 2024/10/31 14:24:31 by chanhihi ### ### ##.kr */
/* */
/* ************************************************************************** */
#include <iostream>
#include <queue>
#include <vector>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
int b[9][9] = {0};
bool checkCross(int y, int x, int n) {
for (int i = 0; i < 9; ++i) {
if (b[y][i] == n || b[i][x] == n) return false;
}
return true;
}
bool checkGroup(int y, int x, int n) {
int ny = (y / 3) * 3;
int nx = (x / 3) * 3;
for (int r = ny; r < ny + 3; ++r) {
for (int c = nx; c < nx + 3; ++c) {
if (b[r][c] == n) return false;
}
}
return true;
}
void printArray() {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cout << b[i][j];
}
cout << "\n";
}
}
bool fillContents(queue<pair<int, int>> nZ) {
if (nZ.empty()) {
printArray();
return true;
}
int ny = nZ.front().first;
int nx = nZ.front().second;
nZ.pop();
for (int i = 1; i <= 9; ++i) {
if (checkCross(ny, nx, i) && checkGroup(ny, nx, i)) {
b[ny][nx] = i;
if (fillContents(nZ)) return true;
b[ny][nx] = 0;
}
}
nZ.push({ny, nx});
return false;
}
int main() {
fastio;
char n;
queue<pair<int, int>> nextZero;
bool v[9][9] = {0};
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> n;
b[i][j] = n - '0';
if (b[i][j] == 0) nextZero.push({i, j});
}
}
fillContents(nextZero);
return 0;
}
'🐣 > BOJ' 카테고리의 다른 글
1005 c++ - ACM Craft (0) | 2024.10.30 |
---|---|
5619 c++ - 세 번째 (0) | 2024.10.24 |
26072 c++ - 곰곰이와 시소 (0) | 2024.10.23 |
11052 c++ - 카드 구매하기 (0) | 2024.10.23 |
17069 c++ - 파이프 옮기기 2 (0) | 2024.10.22 |