思想:暴力,递归,DFS,回溯。填一个数字后检测是否满足条件,不满足就回溯。
#include <iostream>
#include <time.h>
using namespace std;
int S[9][9];
int Check(int Sum)
{
int row=Sum/9,col=Sum%9;
int row2=row/3*3;
int col2=col/3*3;
int i=0,j=0,m=0,n=0;
for(i=0;i<9;i++)//行检查
if(S[row][i]==S[row][col] && col!=i)
return 1;
for(j=0;j<9;j++)//检查列
if(S[j][col]==S[row][col] && row!=j)
return 1;
for(m=row2;m<row2+3;m++)//检查所在的九宫格
{
for(n=col2;n<col2+3;n++)
if(S[row][col]==S[m][n]&&row!=m&&col!=m) return 1;
}
return 0;
}
int SD(int Sum)
{
int row=Sum/9,col=Sum%9;
int flag=0;
if(Sum>80)
{
printf("\\nanswer:\\n");
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d ",S[i][j]);
printf("\\n");
}
return 1;
}
if(S[row][col]==0) //没有数字
{
for (int i=1; i<10; i++) //暴力
{
S[row][col]=i;
if(!Check(Sum))
{
flag=SD(Sum+1); //满足三个条件就递归下一格
if (flag) return 1; //递归返回
}
S[row][col]=0; //注意:回溯后面的数据是要变为零的
}
}
else //有数字
{
flag=SD(Sum+1); //
if (flag) return 1;
}
return 0;
}
int main()
{
clock_t Star,End;
Star=clock();
printf("请输入题目,空白用0代替:\\n");
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
scanf("%d",&S[i][j]);
SD(0);
End=clock();
double Time=(double)(End-Star)/CLOCKS_PER_SEC;
printf("用时:%f秒\\n",Time);
return 0;
}
来源:CSDN
作者:兔子翻书
链接:https://blog.csdn.net/xingkongyj2/article/details/103647072