输出数独表的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"); }