输出数独表的C语言程序代码
程序代码:#include<stdio.h>
int num[9][9],num_n=0,total=0; //num为储存九宫数独表的2维数组,num_n代表第几组数独表,total为总的组数
void sortnum(int sort_n);
void generatenum(int *pctr,int sort_n,int at);
int test_1(int *pctr,int ctr_n);
int test_2(int a,int b);
void printnum();
int main()
{
printf("本程序可列出九宫数独表的所有可能。(cracker134制作)\n按下Enter开始逐份输出数独表:");
sortnum(0);
printf("total=%i\n",total);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
void sortnum(int sort_n) //九格中每个格中九个数字的产生
{
int ctr[9];
generatenum(ctr,sort_n,0);
}
///////////////////////////////////////////////////////////////////////////////////////////
void generatenum(int *pctr,int sort_n,int at) //九格中每个格中各个位置数字的产生
{
for(*(pctr+at)=1;*(pctr+at)<10;(*(pctr+at))++)
{
num[(sort_n%3)*3+at%3][sort_n/3*3+at/3]=*(pctr+at); //把产生的数字在排列在格内,方便检验
if((test_1(pctr,at)==0)||(test_2((sort_n%3)*3+at%3,sort_n/3*3+at/3)==0)) //检验产生的数字是否符合要求
{continue;}
if(at!=8)
{
generatenum(pctr,sort_n,at+1);
}
if((at==8)&&(sort_n!=8))
{
sortnum(sort_n+1);
}
if((at==8)&&(sort_n==8))
{
getchar();
printnum();
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
int test_1(int *pctr,int ctr_n) //检测每格中是否存在相同数
{
int i,res=1;
for(i=0;i<ctr_n;i++)
{
if(*(pctr+ctr_n)==*(pctr+i)){res=0;}
}
return res;
}
///////////////////////////////////////////////////////////////////////////////////////////
int test_2(int a,int b) //检测每行每列是否存在相同数
{
int x,y,res=1;
if(a>2)
{
for(x=0;x<(a/3*3);x++)
{
if(num[x][b]==num[a][b]) {res=0;}
}
}
if(res==1)
{
if(b>2)
{
for(y=0;y<(b/3*3);y++)
{
if(num[a][y]==num[a][b]) {res=0;}
}
}
}
return res;
}
///////////////////////////////////////////////////////////////////////////////////////////
void printnum() //列出数独表
{
int x,y;
num_n++;
printf("第%i组:\n",num_n);
for(y=0;y<9;y++)
{
for(x=0;x<9;x++)
{
printf("%i ",num[x][y]);
if((x==2)||(x==5)){printf(" ");}
}
printf("\n");
if((y==2)||(y==5)){printf("\n");}
}
printf("\n\n\n");
}







