运行环境:VS2012 运行代码:
#include \ #include
bool solve(char board[][9], int boardRowSize, int boardColSize,bool row_array[][9],bool col_array[][9],bool Sudoku_sub_array[][9],int start_i,int start_j) {
//进行递归调用,从第一个元素(从(0,0)到(9,9))开始遍历,不断尝试,属于暴力解决方案。为了节省时间,需要输入当前已经尝试到第几个元素了,然后接着往后面进行尝试
int i = start_i; int j = start_j+1;
for (; i < 9; i++,j=0)//当进行下一行的时候,j需要赋0,表示从下一行的第一列开始遍历了 {
for (; j < 9; j++) {
if (board[i][j]!='.')//已经填写的就跳过 {
continue; int k=0;
for (; k < 9; k++)//k表示填写的数字,1~9。 {
if
(!row_array[i][k]
&&
!col_array[j][k]
}else{
&& !Sudoku_sub_array[i/3*3+j/3][k] )//只有行,列,3x3小格都允许的时候才填写该数字,并且把相应的位置设置为true
{
board[i][j]=k+'1'; row_array[i][k]=true; col_array[j][k]=true;
Sudoku_sub_array[i/3*3+j/3][k]=true; bool
result_flag
=
solve(board,9,9,row_array,col_array,Sudoku_sub_array,i,j);//然后尝试后面一个未填写的元素
if (!result_flag)//如果填写失败,则进行还原操作,以及返回false。 { {
board[i][j]='.'; row_array[i][k]=false; col_array[j][k]=false;
Sudoku_sub_array[i/3*3+j/3][k]=false; continue;
}else//如果填写成功,则返回true
}
}
}
}
}
}
}
return true;
if (k==9)//当数字1~9都试过,则说明没有合适的,返回false { }
return false;
bool flag=true;
for (int i = 0; i < 9; i++)//当(0,0)到(9,9)都遍历了,那么需要确认是否所有的位置都已经{ }
if (flag)//如果都占用了,那么说明已经解决了,返回true { }
return false;
return true;
for (int j = 0; j < 9; j++) { }
if (!(row_array[i][j] && col_array[i][j] && Sudoku_sub_array[i][j]))//只要有一个元素未{ }
return false;
被占用
被占用,那么就返回false
void solveSudoku(char board[][9], int boardRowSize, int boardColSize) {
bool row_array[9][9]={false}; bool col_array[9][9]={false}; bool Sudoku_sub_array[9][9]={false};
for (int i = 0; i < 9; i++)//先记录目前不需要填写的数字,true表示已经被占用了 {
for (int j = 0; j < 9; j++) {
if (board[i][j]=='.') {
continue; }else{
}
}
}
}
int number = board[i][j]-'1'; if (number>=0 && number<9) { { }
return;
row_array[i][number]=true;//按行记录 col_array[j][number] = true;//按列记录
Sudoku_sub_array[i/3*3+j/3][number] = true;//3x3小九宫格记录
}else
solve(board,9,9,row_array,col_array,Sudoku_sub_array,0,-1);
int _tmain(int argc, _TCHAR* argv[]){
clock_t start; start = clock(); char
board[9][9]
=
{{'5','3','.','.','7','.','.','.','.'},{'6','.','.','1','9','5','.','.','.'},{'.','9','8','.','.','.','.','6','.'},{'8','.','.','.','6','.','.','.','3'},{'4','.','.','8','.','3','.','.','1'},{'7','.','.','.','2','.','.','.','6'},{'.','6','.','.','.','.','2','8','.'},{'.','.','.','4','1','9','.','.','5'},{'.','.','.','.','8','.','.','7','9'}}; }
for (int i = 0; i < 9; i++) { }
solveSudoku(board,9,9); for (int i = 0; i < 9; i++) { }
printf(\system(\return 0;
for (int j = 0; j < 9; j++) { }
printf(\
printf(\for (int j = 0; j < 9; j++) { }
printf(\
printf(\