数独的解法c语言

来源:互联网 发布:淘宝采集软件有什么用 编辑:程序博客网 时间:2024/05/16 01:03
/*************************************************************************    > File Name: sudu.c    > Author: ims    > Created Time: 2017年03月18日 星期六 23时41分10秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#define bool int#define false 0#define true 1bool rUsed[9][10],cUsed[9][10],sUsed[9][10];int pos[100];//record null positionint nullNum;int table[9][9];bool DFS_SUDO;void print(){for(int i =0;i<9;i++){   for(int j =0;j<9;j++)   printf("%d",table[i][j]);       printf("\n");}}void DFS(int n){if(n>=nullNum){DFS_SUDO=true;print();///print result return;}int r=pos[n]/9;int c=pos[n]%9;int k=(r/3)*3+(c/3);   //the (r,c) is loacl in k st squarefor(int i=1; i<=9 && !DFS_SUDO; i++){if(cUsed[c][i]) continue; // determine whether it was used or not in columnif(rUsed[r][i]) continue; // determine whether it was used or not in rowif(sUsed[k][i]) continue; // determine whether it was used or not in squarecUsed[c][i]=rUsed[r][i]=sUsed[k][i]=true; //use it and record it is used in column,row,squaretable[r][c]=i;DFS(n+1);//var n plus 1 call DFS()table[r][c]=0;cUsed[c][i]=rUsed[r][i]=sUsed[k][i]=false;}return;}int main (){FILE *fp;int testCase;//num of input casechar line[10];fp=fopen("data_sudu","r");if(fp==NULL)printf("no data_sudu file!");fscanf(fp,"%d", &testCase);fgetc(fp);//printf("the num of case:%d\n",testCase);while(testCase--){nullNum=0;//num of nullfor(int i=0;i<9;i++)for(int j=0;j<10;j++)rUsed[i][j]=cUsed[i][j]=sUsed[i][j]=false;for(int i=0;i<9;i++){fgets(line,11,fp);//read a linefor(int j=0;j<9;j++){table[i][j]=line[j]-'0';if(table[i][j]){rUsed[i][ table[i][j] ]=true;cUsed[j][ table[i][j] ]=true;int k =(i/3)*3 + (j/3);sUsed[k][ table[i][j] ]=true;}elsepos[nullNum++]=9*i+j;//record null position}}printf("the num of null position:%d\n",nullNum);DFS_SUDO= false;DFS(0);// call function DFS()printf("\n");}fclose(fp);return 0;}


0 0