Sudoku Solver 求解数独

  1. 最好的方法是用回溯算法。目前也是我知道的唯一的办法。每个位置1-9挨个验证,当满足一定条件后,输出数独即可。
  2. 代码如下:
  3. #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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值