#include<stdio.h>
char sudoku[9][9];
char arr[9];
//输入
void inSudoku(char sudoku[9][9])
{
int i;
for(i=0;i<9;i++)
scanf("%s",sudoku[i]);
}
//文件读取
void readSudoku(char sudoku[9][9])
{
int i,j;
FILE* fp=fopen("f:\\123.txt","r");
for(i=0;i<9;i++)
fscanf(fp,"%s",sudoku[i]);
fclose(fp);
//for(i=0;i<9;i++){
// for(j=0;j<9;j++)
// printf("%c",sudoku[i][j]);
// printf("\n");}
}
//判断sudoku[i][j]可选择的数字
int judge(int i, int j,char k)
{
int m,n,p,q;
for(m=0;m<9;m++)
if(sudoku[i][m]==k)
return 0;
for(m=0;m<9;m++)
if(sudoku[m][j]==k)
return 0;
p=i/3*3;q=j/3*3;
for(m=p;m<p+3;m++)
for(n=q;n<q+3;n++)
if(sudoku[m][n]==k)
return 0;
return 1;
}
void backtrack(int i,int j)
{
int k,temp=0;
if(i==9 && j==0)//完成[0][0]->[8][8]的深度遍历
{
//printf("get to the end!");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%c",sudoku[i][j]);
printf("\n");
}
}
else
{
if(j<8)
{
if(sudoku[i][j]=='0')
{
for(k=1;k<=9;k++)
{
if(judge(i,j,k+'0'))
{
sudoku[i][j]=k+'0';
j++;
backtrack(i,j);
j--;
sudoku[i][j]='0';
}
}
}
else
{j++;backtrack(i,j);j--;}
}
else
{
if(sudoku[i][j]=='0')
{
for(k=1;k<=9;k++)
{
if(judge(i,j,k+'0'))
{
sudoku[i][j]=k+'0';
i++;
backtrack(i,0);
i--;
sudoku[i][j]='0';
}
}
}
else
{i++;j=0;backtrack(i,j);i--;j=8;}
}
}
}
int main()
{
inSudoku(sudoku);
//readSudoku(sudoku);
backtrack(0,0);
//printf("%d ",judge(0,6,'8'));
return 0;
}
数独
最新推荐文章于 2021-10-16 19:24:37 发布