스도쿠 (2239)

#include<iostream>
using namespace std;

int bCanNums[9][9][10];
int Board[9][9];

void UpdateCanNum(int X, int Y, int Num, bool bIsCan)
{
	if (Num == 0) return;

	int Delta = bIsCan ? -1 : 1;

	for (int i = 0; i < 9; ++i)
	{
		bCanNums[i][X][Num] += Delta;
		bCanNums[Y][i][Num] += Delta;
	}

	for (int y = 0; y < 3; ++y)
	{
		for (int x = 0; x < 3; ++x)
		{
			bCanNums[(Y / 3) * 3 + y][(X / 3) * 3 + x][Num] += Delta;
		}
	}

	return;
}

bool DFS(int Pos)
{
	if (Pos == 81) return true;

	int Y = Pos / 9;
	int X = Pos % 9;
	if (Board[Y][X] != 0) return DFS(Pos + 1);

	for (int i = 1; i < 10; ++i)
	{
		if (bCanNums[Y][X][i] == 0)
		{
			Board[Y][X] = i;
			UpdateCanNum(X, Y, i, false);
			if(DFS(Pos + 1)) return true;
			Board[Y][X] = 0;
			UpdateCanNum(X, Y, i, true);
		}
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0);

	for (int y = 0; y < 9; ++y)
	{
		for (int x = 0; x < 9; ++x)
		{
			char Temp;
			cin >> Temp;
			Board[y][x] = Temp - '0';

			UpdateCanNum(x, y, Board[y][x], false);
		}
	}

	DFS(0);

	for (int y = 0; y < 9; ++y)
	{
		for (int x = 0; x < 9; ++x)
		{
			cout << Board[y][x];
		}
		cout << "\\n";
	}

	return 0;
}

image.png


근데 스도쿠가 만약에 9x9 가 아니라 좀 큰 판이라면

이게 좋은 거 같다.

#include<iostream>
using namespace std;

int Board[9][9];

// Row[A][B]는 A번째 행에 B라는 숫자가 존재한다는 의미
bool Row[9][10];
bool Col[9][10];
bool Square[9][10];

bool DFS(int Pos)
{
	if (Pos == 81) return true;

	int Y = Pos / 9;
	int X = Pos % 9;
	int SquareNum = Y / 3 * 3 + X / 3;

	if (Board[Y][X] != 0) return DFS(Pos + 1);

	for (int i = 1; i < 10; ++i)
	{
		if (!Row[Y][i] && !Col[X][i] && !Square[SquareNum][i])
		{
			Board[Y][X] = i;
			Row[Y][i] = true;
			Col[X][i] = true;
			Square[SquareNum][i] = true;
			if (DFS(Pos + 1)) return true;
			Board[Y][X] = 0;
			Row[Y][i] = false;
			Col[X][i] = false;
			Square[SquareNum][i] = false;
		}
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0);

	for (int y = 0; y < 9; ++y)
	{
		for (int x = 0; x < 9; ++x)
		{
			char Temp;
			cin >> Temp;
			Board[y][x] = Temp - '0';

			Row[y][Board[y][x]] = true;
			Col[x][Board[y][x]] = true;
			Square[y / 3 * 3 + x / 3][Board[y][x]] = true;
		}
	}

	DFS(0);

	for (int y = 0; y < 9; ++y)
	{
		for (int x = 0; x < 9; ++x)
		{
			cout << Board[y][x];
		}
		cout << "\\n";
	}

	return 0;
}

image.png