近段时间用到回溯算法的地方比较多,对算法的理解也有深入。今天偶然发现一张照片,是高中时未做完的一道数独题。当时用的是“候选余数法”,之后由于太麻烦,就没有做完。不过当时截图保存了,今天突然看到。那时候刚学完C语言,对汉诺塔递归都不是太理解,所以就一直拖到现在。
用C++做的,代码如下
#include<iostream> usingnamespace std; intsudoku[9][9]={0}; //判断填在空白位置的数字在行、列上是否符合要求 boolJudge1(int x, int y, int n) { int i; for(i=0;i<9;i++) { //判断 列 if((sudoku[i][y]==n)&& (i!=x)) returnfalse; //判断 行 if((sudoku[x][i]==n)&& (i!=y)) returnfalse; } return true; } //判断填在空白位置的数字在九宫格之内是否符合要求 boolJudge2(int x, int y, int n) { int xx,yy,i,j; xx=x/3; yy=y/3; for(i=xx*3;i<xx*3+3;i++) for(j=yy*3;j<yy*3+3;j++) if(sudoku[i][j]==n) if(i==x&& j==y) continue; else returnfalse; return true; } //填充空白数组 boolFill(int m) { int n,x,y; x=m/9; y=m%9; if (m>=81) return true; if (sudoku[x][y]==0) { for(n=1;n<=9;n++) { sudoku[x][y]=n; if(Judge1(x,y,n)&&Judge2(x,y,n)) if(Fill(m+1)) returntrue; sudoku[x][y]=0; } } else return Fill(m+1); return false; } intmain() { //输入初始数独 int i,j,k; cout << "输入初始数独数据,空白用0代替" <<endl; for(i=0;i<9;i++) for(j=0;j<9;j++) cin>>sudoku[i][j]; /*for(i=0;i<9;i++) { for(j=0;j<9;j++) cout<< sudoku[i][j] << " "; cout << endl; }*/ if(Fill(0))//填充数独的空白位置完毕 { for(i=0;i<9;i++) { for(j=0;j<9;j++) { cout<< sudoku[i][j] << " "; if(!((j+1)%3)) cout<< "| "; } cout<< endl; if(!((i+1)%3)) { for(k=0;k<12;k++) cout<<"__"; cout<< endl; } } } else cout << "该数独无解,请注意游戏规则或检查原始数独是否有误" << endl; return 0; }
运行之后的截图
时间: 2024-10-13 16:17:32