🖥️ CS/Baekjoon Algorithms

#2580번 스도쿠 (c++)

한국의 메타몽 2020. 4. 20. 03:05

https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루어진 정사각형 판 위에서 이뤄지는데, 게임 시작 전 몇 몇 칸에는 1부터 9까지의 숫자 중 하나가 쓰여 있다. 나머지 빈 칸을 채우는 방식은 다음과 같다. 각각의 가로줄과 세로줄에는 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 굵은 선으로 구분되어 있는 3

www.acmicpc.net

스토쿠(9x9)에서 숫자를 집어 넣는데는 조건이 있다. 

1. 가로

2. 세로

3. 3x3칸

이 세 가지에서 겹치는 숫자가 없어야 숫자를 넣을 수 있다. 

따라서 재귀함수로 이 세 가지를 판별하기로 했다.

 

배열은 먼저 int형식으로 만들었고, bool문으로 각 조건들을 판단하며, 상기 언급된 판별문들은 매크로함수를 이용하여 설정했다.

다만, 백트래킹의 원리를 아직 이해못한 탓에 문제를 푸는데 번번히 실수했다. 

아직 백트래킹의 재귀원리를 이해하지 못해서였다.

 

결국 다른 사람의 풀이를 보며 알음알음 이해했다.

https://yabmoons.tistory.com/88

 

[ 백준 2580 ] 스도쿠 (C++)

백준의 스도쿠(2580) 문제이다. ( 문제 바로가기 ) [ 문제풀이 ] 1) 이 문제는 스도쿠 게임의 빈칸에 알맞은 숫자를 채워넣어야 하는 문제이다. 스도쿠 게임은 총 9x9 판위에서 이루어지며, 가로 9칸씩 9줄, 세로..

yabmoons.tistory.com

#include <iostream>
#define MAX 9
using namespace std;

int Map[MAX][MAX];
bool Row[MAX][MAX];
bool Col[MAX][MAX];
bool Square[MAX][MAX];

void Input(){
    for(int i=0; i<MAX; i++){
        for(int j=0; j<MAX; j++){
            cin >> Map[i][j];
            if(Map[i][j]!=0){
                Row[i][Map[i][j]] = true;
                Col[j][Map[i][j]] = true;
                Square[(i/3)*3 + (j/3)][Map[i][j]] = true;
            }
        }
    }
}

void Print(){
    for(int i=0; i<MAX; i++){
        for(int j=0; j<MAX; j++){
            cout << Map[i][j] << " ";
        }
        cout << "\n";
    }
}

void DFS(int Cnt){
    int x = Cnt/MAX;
    int y = Cnt%MAX;
    
    if(Cnt==81){
        Print();
        exit(0);
    }
    
    if(Map[x][y]==0){
        for(int i=1; i<=9; i++){
            if(Row[x][i]==false&&Col[y][i]==false&&Square[(x/3)*3+(y/3)][i]==false){
                Row[x][i] = true;
                Col[y][i] = true;
                Square[(x/3)*3 +(y/3)][i] = true;
                Map[x][y] = i;
                DFS(Cnt+1); // 해당 숫자가 아닐 경우 백트래킹 시작
                Map[x][y] = 0;
                Row[x][i] = false;
                Col[y][i] = false;
                Square[(x/3)*3+(y/3)][i] = false;
            }
        }
    }
    else DFS(Cnt+1);
}

void Solution(){
    DFS(0);
}

void Solve(){
    Input();
    Solution();
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    Solve();
    
    return 0;
}

 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#14889번 스타트와 링크 (c++)  (0) 2020.04.21
#14888번 연산자 끼워넣기 (c++)  (0) 2020.04.20
#9663번 N-Queen (C++)  (0) 2020.03.22
#15650번 N과M(2) (c++)  (0) 2020.03.16
#15649번 N과M(1) (c++)  (0) 2020.03.15