题目
Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题:
给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1-9的数字,其余的则为空白(数字0为空白)。请在空白表格中填入数字1-9使得9*9表格的每行、每列、每个3*3块内无重复数字。
Input
第一行输入一个整数T,表示样例数量。对于每个样例, 一共9行, 表示数独表格的每一行。接下来每一行输入一个字符串表示数独表格的每一行的9个数字。数独表格中空白用数字0表示。
Output
对于每组样例,输出完整的数独表格,即数独表格的每一个空白都按规定填满数字。如果答案不唯一,输出任何一个答案就行。
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
行列判断数 每个小9宫格判断数 有个点注意要return 代码中标注了
#include<stdio.h>
#include<string.h>
using namespace std;
int hang[9][10]= {0};
int lie[9][10]= {0};
int meige[9][10];
int map[9][9];
int ji[9][9];
char ling[9][9];
int flag=0;
void re(int x,int y)
{
if(x==8&&y==8)
{
flag=1;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
printf("%d",map[i][j]);
}
printf("\n");
}
}
if(flag==1)
return ;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
if(i==8&&j==8&&map[i][j])
{
flag=1;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
printf("%d",map[i][j]);
}
printf("\n");
}
}
if(ji[i][j]==0)
{
// printf("%d %d\n",i,j);
for(int z=1; z<=9; z++)
{
int k=3*(i/3)+j/3;
if(hang[i][z]==0&&lie[j][z]==0&&meige[k][z]==0)
{
map[i][j]=z;
ji[i][j]=1;
hang[i][z]=1;
lie[j][z]=1;
meige[k][z]=1;
// printf("%d\n",map[i][j]);
re(i,j);
map[i][j]=0;
ji[i][j]=0;
hang[i][z]=0;
lie[j][z]=0;
meige[k][z]=0;
if(flag)
return ;
}
}
return ;//这里不加就到下一个位置了
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
flag=0;
memset(ling,0,sizeof(ling));
memset(map,0,sizeof(map));
memset(ji,0,sizeof(ji));
memset(meige,0,sizeof(meige));
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
for(int i=0; i<9; i++)
{
scanf("%s",ling[i]);
}
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
map[i][j]=ling[i][j]-'0';
if(map[i][j]!=0)
{
hang[i][map[i][j]]=1;
lie[j][map[i][j]]=1;
ji[i][j]=1;
int k=3*(i/3)+(j/3);
meige[k][map[i][j]]=1;
}
}
}
re(0,0);
// for(int i=0; i<9; i++)
// {
// for(int j=0; j<9; j++)
// {
// printf("%d",map[i][j]);
// }
// printf("\n");
// }
}
return 0;
}