#include <iostream>
#include <stdio.h>
using namespace std;
//此时这个数组称为全局变量
int a[9][9]={
{1,4,5,3,2,7,6,9,8},
{8,3,9,6,5,4,1,2,7},
{6,7,2,9,1,8,5,4,3},
{4,9,6,1,8,5,3,7,2},
{2,1,8,4,7,0,9,0,6},
{7,5,3,2,9,6,0,8,1},
{3,6,7,5,4,2,0,1,0},
{9,8,4,7,6,1,2,3,5},
{0,2,0,8,3,9,7,0,4}
};
bool jugde(int x,int y,int e)//判断数独是否有重复数字,有就返回0,无就返回1
{
int i,j,n,m;
for(i=0;i<9;i++)//判断列
if(a[i][y] == e) return 0;
for(i=0;i<9;i++)//判断行
if(a[x][i] == e) return 0;
/*
用x/3*3 y/3*3 算出此时的九宫格的左上角的坐标
用i,n计数 读取九宫格的中数字内容 看有没有重复
*/
for(i=x/3*3,n=0;n<3;n++,i++)
for(j=y/3*3,m=0;m<3;m++,j++)
if(a[i][j] == e) return 0;
return 1;
}
void dfs(int a[9][9],int x,int y)//深度优先搜索求解
{
int i,j;//计数
if(x>8) //函数递归出口
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return;
}
if(a[x][y] == 0)//为a[x][y] == 0
{
for(i=1;i<10;i++)//赋值过程
{
if(jugde(x,y,i))//判断是否与已有数值重复
{
a[x][y]=i;
dfs(a,(x+(y+1)/9),(1+y)%9);
}
}
a[x][y]=0;//返回上个函数,此时a[x][y]归零
}
else dfs(a,(x+(y+1)/9),(y+1)%9);//不为零跳过
}
int main()
{
int x=0,y=0;
dfs(a,x,y);
return 0;
}
蓝桥杯 数独 问题 C++/C
最新推荐文章于 2024-07-23 15:46:40 发布