- 最好的方法是用回溯算法。目前也是我知道的唯一的办法。每个位置1-9挨个验证,当满足一定条件后,输出数独即可。
- 代码如下:
- #include
using namespace std;
int Sudoku[9][9] =
{
{5,3,0,0,7,0,0,0,0},
{6,0,0,1,9,5,0,0,0},
{0,9,8,0,0,0,0,6,0},
{8,0,0,0,6,0,0,0,3},
{4,0,0,8,0,3,0,0,1},
{7,0,0,0,2,0,0,0,6},
{0,6,0,0,0,0,2,8,0},
{0,0,0,4,1,9,0,0,5},
{0,0,0,0,8,0,0,7,9},
};
bool isValid(int row, int col, int val)
{
if (row < 0 || row >= 9 || col < 0 || col >= 9)
{
return false;
}
if (Sudoku[row][col] != 0)
{
return false;
}
for (int i = 0; i < 9; i++)
{
if (Sudoku[row][i] == val)
{
return false;
}
}
for (int i = 0; i < 9; i++)
{
if (Sudoku[i][col] == val)
{
return false;
}
}
int row1 = row / 3;
int col1 = col / 3;
int rowstart = row1 * 3;
int colstart = col1 * 3;
for (int i = rowstart; i < rowstart + 3; i++)
{
for (int j = colstart; j < colstart + 3; j++)
{
if (Sudoku[i][j] == val)
{
return false;
}
}
}
return true;
}
void display()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << Sudoku[i][j] << " ";
}
cout << endl;
}
cout << “----------------” << endl;
}
void SolveSudoku(int i, int j)
{
if (i >= 9)
{
display();//i>8的时候说明,一计算玩数独。打印即可。
}
if (j >= 9)
{
SolveSudoku(i + 1, 0);//j>8的时候说明当前的行已经匹配完成。
}
if (Sudoku[i][j] == 0)
{
for (int num = 1; num <= 9; num++)
{
if (isValid(i, j, num))
{
Sudoku[i][j] = num;//回溯算法一定要保留现场和恢复现场。这样下次计算不会出现问题。
SolveSudoku(i, j + 1);
Sudoku[i][j] = 0;
}
}
}
else
{
SolveSudoku(i, j + 1);
}
}
int main()
{
SolveSudoku(0,0);
system(“pause”);
return 0;
}