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