【DFS】数独游戏

数独游戏只有一个规则:将 9 × 9 9\times9 9×9 的矩阵填满,使得每一行,每一列,和每一个小的九宫格恰好包含 1 ∼ 9 1\sim9 19 9 9 9 个数字。

你需要编写一个程序填写不完整的数独。


直接DFS。


代码

懒,直接动手打了表。。

#include<cstdio>
int k[20][20], a[20][20], l[20][20], h[20][20], jz[20][20], flag;
int read(){
	char c = getchar();
	while((c > '9' || c < '0') && c != '?') c = getchar();
	if(c == '?') return 0;
	else return c - 48;
}
void csh(){
	k[1][1] = k[1][2] = k[1][3] = k[2][1] = k[2][2] = k[2][3] 
			= k[3][1] = k[3][2] = k[3][3] = 1;
	k[4][1] = k[4][2] = k[4][3] = k[5][1] = k[5][2] = k[5][3] 
			= k[6][1] = k[6][2] = k[6][3] = 4;
	k[7][1] = k[7][2] = k[7][3] = k[8][1] = k[8][2] = k[8][3] 
			= k[9][1] = k[9][2] = k[9][3] = 7;
	k[1][4] = k[1][5] = k[1][6] = k[2][4] = k[2][5] = k[2][6] 
			= k[3][4] = k[3][5] = k[3][6] = 2;
	k[4][4] = k[4][5] = k[4][6] = k[5][4] = k[5][5] = k[5][6] 
			= k[6][4] = k[6][5] = k[6][6] = 5;
	k[7][4] = k[7][5] = k[7][6] = k[8][4] = k[8][5] = k[8][6] 
			= k[9][4] = k[9][5] = k[9][6] = 8;
	k[1][7] = k[1][8] = k[1][9] = k[2][7] = k[2][8] = k[2][9] 
			= k[3][7] = k[3][8] = k[3][9] = 3;
	k[4][7] = k[4][8] = k[4][9] = k[5][7] = k[5][8] = k[5][9] 
			= k[6][7] = k[6][8] = k[6][9] = 6;
	k[7][7] = k[7][8] = k[7][9] = k[8][7] = k[8][8] = k[8][9] 
			= k[9][7] = k[9][8] = k[9][9] = 9;
}
void dfs(int x, int y){
	if(x == 10){
		flag = 1;
		return;
	}
	if(a[x][y] != 0){
		if(y+1 <= 9) dfs(x, y+1);
		else dfs(x+1, 1);
		return;
	}
	for(int i = 1; i <= 9; ++i)
		if(l[y][i] == 0 && h[x][i] == 0 && jz[k[x][y]][i] == 0){
			l[y][i] = 1;
			h[x][i] = 1;
			jz[k[x][y]][i] = 1;
			a[x][y] = i;
			if(y+1 <= 9) dfs(x, y+1);
				else dfs(x+1, 1);
			if(flag == 1) return;
			a[x][y] = 0;
			l[y][i] = 0;
			h[x][i] = 0;
			jz[k[x][y]][i] = 0;
		}
}
int main(){
	freopen("sudoku.in","r",stdin);
	freopen("sudoku.out","w",stdout);
	csh();
	for(int i = 1; i <= 9; ++i){
		for(int j = 1; j <= 9; ++j){
			a[i][j] = read();
			if(a[i][j] != 0){
				l[j][a[i][j]] = 1;
				h[i][a[i][j]] = 1;
				jz[k[i][j]][a[i][j]] = 1;
			}
		}
	}
	dfs(1, 1);
	for(int i = 1; i <= 9; ++i){
		for(int j = 1; j <= 9; ++j)
			printf("%d", a[i][j]);
		printf("\n");
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值