[ ALGORITHM ]/[ 백 준 ]

[BAECKJOON] 2580번 스도쿠

HiStar__ 2020. 6. 18. 17:13

문 제

소 스  코 드

#include <iostream>
#include <vector>

constexpr int MAX_BOARD			{ 9 };
constexpr int SUDOKU_EMPTY		{ 0 };


void Func(const int&);
bool Is_Exist(const int&, const int&);
void Display();

int sudoku_board[MAX_BOARD][MAX_BOARD];
std::vector<std::pair<int, int>> sudoku;
bool finish{ false };

int main() {
	// reserver vector
	sudoku.reserve(MAX_BOARD * MAX_BOARD);

	// input & search 0 index
	for (int y = 0; y < MAX_BOARD; ++y) {
		for (int x = 0; x < MAX_BOARD; ++x) {
			std::cin >> sudoku_board[y][x];

			if(SUDOKU_EMPTY == sudoku_board[y][x])sudoku.emplace_back(std::make_pair(y, x));

		}
	}

	Func(0);

	return 0;
}

void Display() {
	std::cout << '\n';
	for (int y = 0; y < MAX_BOARD; ++y) {
		for (int x = 0; x < MAX_BOARD; ++x) {
			std::cout << sudoku_board[y][x]<< " ";

		}
		std::cout << '\n';
	}
}

bool Is_Exist(const int& length, const int& idx) {
	int board_first = (sudoku[length].first / 3) * 3;
	int board_second = (sudoku[length].second / 3) * 3;

	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			if (idx == sudoku_board[i + board_first][j + board_second])		return false;
		}
	}
	for (int i = 0; i < MAX_BOARD; ++i) {
		if (idx == sudoku_board[sudoku[length].first][i])				return false; 
		if (idx == sudoku_board[i][sudoku[length].second])				return false;

	}
	return true;
}

void Func(const int& length) {
	if (true == finish) return;
	if (length == sudoku.size()) {
		finish = true;
		Display();
		return;
	}

	for (int i = 1; i < MAX_BOARD + 1; ++i) {
		if (false == Is_Exist(length, i)) continue;
		sudoku_board[sudoku[length].first][sudoku[length].second] = i;
		Func(length + 1);
		sudoku_board[sudoku[length].first][sudoku[length].second] = 0;
	}
	return;
}

 

풀 이

  • 0을 가지고 있는 위치 배열의 x, y를 알아야 한다!
    vector와 pair<>를 통해 이를 추가 관리 한다.
  • 한 곳에 있을 수 있는 숫자는 1 ~ 9 이다.
  • vector에 담겨 있는 모든 값을 순회하여 각 숫자에 따라 재귀 호출을 통해 진행하며 수정하며 반복한다.

 

실 수 한  사 항

  • exit(1)로 프로그램을 끝내려고 하면 런타임 오류가 발생한다.

 

결 과 값

 

 

문 제  출 처

문제 링크 : [ BAEKJOON ] https://www.acmicpc.net/problem/2580