洛谷P1784_数独游戏

#include <cstdio>
#include <cstdlib>

using namespace std;

int a[9][9];

int dfs(int m);
bool canplace(int row, int col, int num);
void output();

int main()
{
	int i, j;
	for(i = 0; i < 9; i ++)
		for(j = 0; j < 9; j ++)
            scanf("%d", &a[i][j]);
	dfs(0);
	return 0;
}

bool canplace(int row, int col, int num)
{
	int i, j, trow, tcol;
	trow = row / 3 * 3;//找到在该小方格的左上方格子
	tcol = col / 3 * 3;
	for(i = 0; i < 9; i ++)//行列无冲突
		if(a[row][i] == num || a[i][col] == num)
            return 0;
	for(i = 0; i < 3; i ++)//小方格内无冲突
		for(j = 0; j < 3; j ++)
			if(a[trow + i][tcol + j] == num)
				return 0;
	return 1;
}

void output()
{
	for(int i = 0; i < 9; i ++)
		for(int j = 0; j < 9; j ++)
			printf("%d%c", a[i][j], j==8?'\n':' ');
	exit(0);
}

int dfs(int m)//rol = m / 9; col = m % 9;
{
	int row = m / 9;
	int col = m % 9;
	if(m == 81) output();
	if(a[row][col] > 0) dfs(m + 1);//如果是题目已知的点,则放下一个
	else
	{
		for(int i = 1; i <= 9; i++)
			if(canplace(row, col, i))
			{
				a[row][col] = i;
				dfs(m + 1);
				a[row][col] = 0;//回溯
			}
	}
}


猜你喜欢

转载自blog.csdn.net/jay__bryant/article/details/80246482