HyeLog

๋ฐฑ์ค€_2580_์Šค๋„์ฟ  ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_2580_์Šค๋„์ฟ 

shj718 2022. 5. 4. 14:06

๐Ÿ“๋ฌธ์ œ: https://www.acmicpc.net/problem/2580

 

2580๋ฒˆ: ์Šค๋„์ฟ 

์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ, ์„ธ๋กœ ๊ฐ๊ฐ 9๊ฐœ์”ฉ ์ด 81๊ฐœ์˜ ์ž‘์€ ์นธ์œผ๋กœ ์ด๋ฃจ

www.acmicpc.net

 

๐Ÿ“์•Œ๊ณ ๋ฆฌ์ฆ˜: ๋ฐฑํŠธ๋ž˜ํ‚น (์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์ฃผ์–ด์ ธ์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)

 

๐Ÿ“์•„์ด๋””์–ด: N-Queen ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ boolํ˜• ๋ฐฐ์—ด ํ™œ์šฉ

 

+ exit(0) : ํ”„๋กœ๊ทธ๋žจ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ. (์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์™”์„ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ ์‚ฌ์šฉ)

 

๐Ÿ“์ฝ”๋“œ:

#include <iostream>

using namespace std;

int board[9][9];
bool row[9][10];
bool col[9][10];
bool square[9][10];

// ํ–‰, ์—ด, ๋Œ€๊ฐ์„ ์— ๋Œ€ํ•ด์„œ boolํ˜• ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ ์ €์žฅ.

int getSquare(int x, int y) {
	return (x / 3) * 3 + (y / 3);
}

void solve(int n) { // n๋ฒˆ์งธ ์นธ = xํ–‰ * 9 + y์—ด
	// ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ
	if (n == 81) {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				cout << board[i][j] << ' ';
			}
			cout << '\n';
		}
		exit(0);
	}
	// ๋‹ค์Œ ํ˜ธ์ถœ (์กฐ๊ฑด ๊ฒ€์‚ฌ)
	int x = n / 9;
	int y = n % 9;
	if (board[x][y] != 0) { // ๋นˆ์นธ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์Œ ์นธ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ
		solve(n + 1);
	}
	else { // ๋นˆ์นธ์ด๋ผ๋ฉด
		for (int i = 1; i <= 9; i++) {
			if (row[x][i] == false && col[y][i] == false && square[getSquare(x, y)][i] == false) { // ์กฐ๊ฑด ๊ฒ€์‚ฌ
				// ํ˜ธ์ถœ ์ „ ์ค€๋น„
				row[x][i] = col[y][i] = square[getSquare(x, y)][i] = true;
				board[x][y] = i;
				// ํ˜ธ์ถœ
				solve(n + 1);
				// ํ˜ธ์ถœ ํ›„ ๋ณต๊ตฌ
				row[x][i] = col[y][i] = square[getSquare(x, y)][i] = false;
				board[x][y] = 0;
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			cin >> board[i][j];
			row[i][board[i][j]] = true;
			col[j][board[i][j]] = true;
			square[getSquare(i, j)][board[i][j]] = true;
		}
	}
	solve(0);
	return 0;
}