알고리즘 모음(C++)

백준 2580 - 스도쿠(C++) 본문

백준

백준 2580 - 스도쿠(C++)

공대생의 잡다한 사전 2023. 1. 19. 16:51

문제 링크입니다. https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

백트래킹을 이용해 푸는 문제입니다.

해당 문제와 완전히 같은 방식으로 푸는 문제였습니다.

https://junseok.tistory.com/316

 

백준 2239 -스토쿠(C++)

문제 링크입니다. https://www.acmicpc.net/problem/2239 2239번: 스도쿠 스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자

junseok.tistory.com

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>
#define P pair<int,int>
#define PP pair<P, int>
#define F first
#define S second
#define LL long long
#define INF 9876543210
using namespace std;

int map[10][10];
int row[10][10]; //행의 X번째에서 Y값을 사용?
int col[10][10]; //열의 X번째에서 Y값을 사용?
int square[4][4][10]; //(X,Y) 사각형에서 Z값 사용?
int num = 0;

bool fill_square(int cnt){
    num += 1;
    if(num >= 10000000) return true;
    if(cnt == 81){
        for(int i = 0; i < 9; i++){
           for(int j = 0; j < 9; j++){
               cout << map[i][j] << " ";
            }
            cout << "\n";
        }
        return true;
    }
    int x = cnt/9;
    int y = cnt%9;
    if(map[x][y] != 0) return fill_square(cnt+1);
    else{
       for(int k = 1; k <= 9; k++){
            if(square[x/3][y/3][k] != 0) continue;
            if(row[x][k] != 0) continue;
            if(col[y][k] != 0) continue;
            square[x/3][y/3][k] = 1;
            row[x][k] = 1; 
            col[y][k] = 1;
            map[x][y] = k;
            if(fill_square(cnt+1)) return true;
            square[x/3][y/3][k] = 0;
            row[x][k] = 0;
            col[y][k] = 0;
            map[x][y] = 0;
        }
    }
    return false;
}

void solve(){
    fill_square(0);
}

int main() {
	cin.tie(0);
	cout.tie(0);
	for(int i = 0; i < 9; i++){
	    for(int j = 0; j < 9; j++){
	        scanf("%01d", &map[i][j]);
	        if(map[i][j] != 0){
	            row[i][map[i][j]] = 1;
	            col[j][map[i][j]] = 1;
	            square[i/3][j/3][map[i][j]] = 1;
	        }
	    }
	}
	solve();
	return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요

'백준' 카테고리의 다른 글

백준 2629 - 양팔저울(C++)  (0) 2023.01.20
백준 7579 - 앱(C++)  (0) 2023.01.19
백준 2239 -스도쿠(C++)  (0) 2023.01.18
백준 2473 - 세 용액(C++)  (0) 2023.01.17
백준 2467 - 용액(C++)  (0) 2023.01.17