POJ 2676 Sudoku深搜

題意:給你一個數獨,然後填寫,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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章