//数独问题,一个大的九宫格被划分为九个小的九宫格
//每行,每列,每个小九宫格内的数字不能重复
//0代表空格,非0代表已填入元素
//小格子一共有9*9=81个,从第一个小格子开始把1~9逐个放入测试
//可以用深搜,将搜到的已经填入的数字个数转化成行和列
#include<stdio.h>
int num[9][9];
int flag;
int check(int b,int x)
{
int x1 = b/9; //大九宫格中的行
int y1 = b%9; //大九宫格中的列
int x2 = b/9/3*3; //小九宫格中的行
int y2 = b%9/3*3; //小九宫格中的列
for(int i=0; i<9; i++)
if(num[x1][i] == x || num[i][y1] == x) return 0; //检查是否在要填入的格子的行列中出现过
for(int i=x2; i<x2+3; i++)
for(int j=y2; j<y2+3; j++)
if(num[i][j] == x)return 0; // 检查是否在小九宫格中出现过
return 1;
}
int dfs(int a)
{
if(a>80)
{
flag = 1;
return 0;
}
if(num[a/9][a%9]!=0)
{
dfs(a+1);
}
else
{
for(int i=1; i<=9; i++) //数字从一到九挨个尝试填入格中
{
if(check(a,i))
{
num[a/9][a%9] = i;
dfs(a+1);
if(flag)return 0;
num[a/9][a%9] = 0;
}
}
}
}
int main()
{
int r;
scanf("%d",&r);
while(r--)
{
for(int i=0; i<9; i++)
for(int j=0; j<9; j++)
scanf("%1d",&num[i][j]); //输入可以用%1d,不用字符串
flag = 0;
dfs(0);
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
printf("%d",num[i][j]);
}printf("\n");
}
}
return 0;
}
POJ2676
最新推荐文章于 2019-08-08 13:13:11 发布