알고리즘/PS

[C++] 백준 2580 : 스도쿠

BigmacGood 2022. 3. 29. 18:16

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

 

2580번: 스도쿠

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

www.acmicpc.net

백준 2580번 스도쿠를 풀어봤습니다.

비어있는 곳을 벡터에 넣어서 백트래킹 함수에서 사용했습니다.

isPromising함수에서 같은 열, 같은 행, 같은 구역인지 체크하고 promising하면 true를 넘겨줬습니다.

 

아래는 전체 코드입니다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

int board[9][9];
vector<pair<int, int>> v;

bool isPromising(int x,int y) {
	for (int i = 0; i < 9; i++) {
		if (board[x][i] == board[x][y] && i != y)
			return false;
		if (board[i][y] == board[x][y] && i != x)
			return false;
	}

	int tx = x / 3;
	int ty = y / 3;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (x == tx * 3 + i && y == ty * 3 + j)
				continue;

			if ((board[i + tx * 3][j + ty * 3] == board[x][y]))
				return false;
		}
	}

	return true;
}

void sudoku(int level) {
	if (level == v.size()) {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				cout << board[i][j] << ' ';
			}
			cout << '\n';
		}
		exit(0);
		return;
	}

	int x = v[level].first;
	int y = v[level].second;

	for (int i = 0; i < 9; i++) {
		board[x][y] = i + 1;
		if (isPromising(x, y)) {
			sudoku(level + 1);
			
		}
		board[x][y] = 0;
	}
}

int main() {
	int temp;
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			cin >> temp;
			board[i][j] = temp;
			if (temp == 0) {
				v.push_back({ i,j });
			}
		}
	}

	sudoku(0);

	return 0;
}

 

'알고리즘 > PS' 카테고리의 다른 글

[C++] 백준 5430 : AC  (0) 2022.03.30
[C++] 백준 1504 : 특정한 최단경로  (0) 2022.03.29
[C++] 백준 9663 : N-Queen  (0) 2022.03.29
[C++] 백준 1753 : 최단 경로  (0) 2022.03.28
[C++] 백준 1107 : 리모컨  (0) 2022.03.27