POJ 2676 Sudoku深搜

匿名 (未验证) 提交于 2019-12-03 00:22:01

题意:给你一个数独,然后填写,cell内是0的话就填入一个数字(1-9),每一行,每一列数字不能重复,3*3方块(不是每一个,看图就懂了,一共9个3*3)每一个数字不能重复。

想法:对于每一个cell,枚举1-9,然后填入判断行,列和3*3方块是否有重复数字,没有填入,有的话就换一个数字。然后任意输出一个解即可。

#include<stdio.h> #include<string.h>  int sudoku[10][10]; char sudoku_char[15][15]; void init() { 	memset(sudoku_char, '\0', sizeof(sudoku_char)); } int get_lu(int x) { 	if(x >= 1 && x <= 3) return 1; 	if(x >= 4 && x <= 6) return 4; 	return 7; } bool Judge(int x, int y, int num) { 	int cnt = 0; 	for(int i = 1; i <= 9; ++i){ 		if(sudoku[x][i] == num) return false; 		if(sudoku[i][y] == num) return false; 	} 	int left_up_x = get_lu(x); 	int left_up_y = get_lu(y); 	for(int i = left_up_x; i <= left_up_x + 2; ++i){ 		for(int j = left_up_y; j <= left_up_y + 2; ++j){ 			if(sudoku[i][j] == num) return false; 		} 	} 	return true; } int DFS(int x, int y) { 	if(x == 10 && y == 10) return 1; 	if(y != 9)  y %= 9; 	if(sudoku[x][y]){ 		if(DFS(x + y/9, y + 1)) return 1; 	} 	else{ 		for(int i = 1;i <= 9; ++i){ 			if(!Judge(x, y, i)) continue; 			sudoku[x][y] = i; 			if(DFS(x + y/9, y + 1)) return 1; 			sudoku[x][y] = 0; 		} 	} 	return 0; } int main() { 	int T; 	scanf("%d",&T); 	while(T--){ 		init(); 		for(int i = 1;i <= 9; ++i){ 			scanf("%s",sudoku_char[i] + 1); 		} 		for(int i = 1;i <= 9; ++i){ 			for(int j = 1;j <= 9; ++j){ 				sudoku[i][j] = sudoku_char[i][j] - '0'; 			} 		} 		DFS(1,1); 		for(int i = 1; i <= 9; ++i){ 			for(int j = 1; j <= 9; ++j){ 				printf("%d",sudoku[i][j]); 			} 			printf("\n"); 		} 	} 	return 0; }

文章来源: POJ 2676 Sudoku深搜
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!