오늘의 알고리즘

[C++] 백준 2239 스도쿠

하늘하늘 . 2022. 11. 25. 21:52
#include <iostream>
#include <string.h>
 
int sudoku[9][9] = {};
bool row[9][9] = {};
bool col[9][9] = {};
bool visit[9][9] = {};
 
void DFS(int count)
{
    int x = count / 9;
    int y = count % 9;
 
    if (count == 81)
    {
        for (int i = 0; i < 9; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                std::cout << sudoku[i][j];
            }
 
            std::cout << "\n";
        }
 
        exit(0);
    }
 
    if (!sudoku[x][y])
    {
        for (int i = 1; i <= 9; ++i)
        {
            if (!row[x][i] && !col[y][i] && !visit[(x / 3) * 3 + (y / 3)][i])
            {
                row[x][i] = true;
                col[y][i] = true;
                visit[(x / 3) * 3 + (y / 3)][i] = true;
                sudoku[x][y] = i;
                DFS(count + 1);
                sudoku[x][y] = 0;
                row[x][i] = false;
                col[y][i] = false;
                visit[(x / 3) * 3 + (y / 3)][i] = false;
            }
        }
    }
 
    else 
        DFS(count + 1);
}
 
int main(void)
{
 
    for (int i = 0; i < 9; ++i)
    {
        std::string s = {};
        std::cin >> s;
 
        for (int j = 0; j < s.size(); ++j)
        {
            sudoku[i][j] = s[j] - '0';
 
            if (sudoku[i][j])
            {
                row[i][sudoku[i][j]] = true;
                col[j][sudoku[i][j]] = true;
                visit[(i / 3) * 3 + (j / 3)][sudoku[i][j]] = true;
            }
        }
    }
 
    DFS(0);
 
    return 0;
}

 

스도쿠는 가로 세로 3x3 박스에 한 가지의 수만 있어야 합니다.
row는 가로, col는 세로, visit은 3x3 박스를 의미합니다.
x는 가로, y는 세로 현재 세로를 의미합니다.
그렇기 대문에 모든 카운팅을 전부 다 돌아야합니다.
0, 0 번부터 계속해서 진행하면서 없는 경우 넣어주고 계속해서 돌려줍니다.
여러 가지의 상황이 나올 수 있기 때문에 exit(0) 함수로 프로세스 종료를 해줘야합니다.