public boolean updateStdSudoKu() { Random random = new Random(); for(int i=0;i<9;++i) for(int j=0;j<9;++j) m_stdSudoKu[i][j] = 0; for(int i=0;i<9;++i) for(int j=0;j<9;++j) { int left[] = new int[10]; for(int in=0;in<10;++in) left[in] = in; //列 for(int col=0;col<9;++col) { if(col == j) continue; if(m_stdSudoKu[i][col] !=0) left[m_stdSudoKu[i][col]] = 0; } //行 for(int row=0;row<9;++row) { if(row == i) continue; if(m_stdSudoKu[row][j] != 0) left[m_stdSudoKu[row][j]] = 0; } int blockStartI = (i / 3) * 3; int blockStartJ = (j / 3) * 3; for(int blockI = blockStartI;blockI < blockStartI+3;++blockI) for(int blockJ = blockStartJ;blockJ < blockStartJ+3;++blockJ) { if(i==blockI && j==blockJ) continue; if(m_stdSudoKu[blockI][blockJ] != 0) left[m_stdSudoKu[blockI][blockJ]] = 0; } int resLeft[] = new int[9]; int cnt = 0; for(int resI = 0;resI < 10;++resI) if(left[resI] != 0) { resLeft[cnt++] = left[resI]; } if(cnt == 0) { return false; } int randomI = random.nextInt(cnt); m_stdSudoKu[i][j] = resLeft[randomI]; } return true; }
其中m_stdSudoKu[9][9]是9*9的数组,用于保存完整的数独。这个函数由于一次可能无法得到数独,所以调用的时候需要循环调用,知道返回true。
该算法原理就是每次得到某个空格数字就要进行3重限制的校对,排除横,竖,3*3宫格已经出现过的数字。