백준 2580번 스도쿠

2020. 1. 7. 14:58Problem solving/Baekjoon Online Judge

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

 

2580번: 스도쿠

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

www.acmicpc.net

백트래킹 구현시 항상 search()함수를 void 타입으로 구현했는데, int형으로 수정되어 최초해가 나오면 바로 모든 search()함수가 종료되어 답이 바로 출력되는 소스코드. (linejin님이 수정)

#include<iostream>
#include<vector>
#include<utility>
using namespace std;
vector<pair<int, int>> v;
int sudoku[9][9];
int search(int cnt) {
	if (cnt >= v.size()) return 1;
	bool used_1[10];
	bool used_2[10];
	bool used_3[10];
	for (int i = 0; i <= 9; i++) { used_1[i] = false; used_2[i] = false; used_3[i] = false;}
	for (int i = 0; i < 9; i++) { //가로 세로 동시에 중복 체크
		if (sudoku[v[cnt].first][i])
		{
			if (!used_1[sudoku[v[cnt].first][i]])
				used_1[sudoku[v[cnt].first][i]] = true;
			else return 0;
		}
		if (sudoku[i][v[cnt].second])
		{
			if (!used_2[sudoku[i][v[cnt].second]])
				used_2[sudoku[i][v[cnt].second]] = true;
			else return 0;
		}
	}
	for (int i = v[cnt].first / 3 * 3; i < v[cnt].first / 3 * 3 + 3; i++) //정사각형 박스 중복 체크
		for (int j = v[cnt].second / 3 * 3; j < v[cnt].second / 3 * 3 + 3; j++)
			if (sudoku[i][j])
			{
				if (!used_3[sudoku[i][j]])
					used_3[sudoku[i][j]] = true;
				else return 0;
			}
	for (int i = 1; i <= 9; i++) { //유망한 숫자들 대입
		if (!used_1[i]&& !used_2[i]&& !used_3[i]) {
			sudoku[v[cnt].first][v[cnt].second] = i;
			if (search(cnt + 1))
				return 1;
			sudoku[v[cnt].first][v[cnt].second] = 0;
		}
	}
	return 0;
}
int main() {
	for (int i = 0; i < 9; i++) { //입력
		for (int j = 0; j < 9; j++) {
			int x;
			cin >> x;
			sudoku[i][j] = x;
			if (x == 0) v.push_back(make_pair(i, j)); //빈칸이라면 벡터에 좌표저장
		}
	}
	search(0);
	for (int i = 0; i < 9; i++) { //출력
		for (int j = 0; j < 9; j++) {
			if (j == 8) cout << sudoku[i][j] << "\n";
			else cout << sudoku[i][j] << " ";
		}
	}
	return 0;
}

'Problem solving > Baekjoon Online Judge' 카테고리의 다른 글

백준 300 솔브 달성  (0) 2020.05.04
11401번 - 이항 계수 3  (0) 2020.03.04
백준 1003번 피보나치 함수  (0) 2020.01.15