当前位置:   article > 正文

数独求解(DFS)_数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在

题目:数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

思路:从9×9的数独矩阵的第一格开始,一直求解到最后一格。 每一格都遍历 1~9 这9种数字,并且检查是否合法,如果合法就继续下一格。

变量:数独矩阵sudoku[9][9],以及当前求解的下标num. (行num/9, 列num%9),数独矩阵定义成全局变量,下标作为参数。

int sudoku[9][9];

求单一解,所以dfs函数定义成bool型。

查看当前格子填入当前数字后是否合法:

  1. bool check(int row, int col, int val)
  2. {
  3. for(int i=0;i<9;i++)
  4. if (sudoku[row][i] == val)
  5. return false;
  6. for(int i = 0; i<9; i++)
  7. if (sudoku[i][col] == val)
  8. return false;
  9. for(int i=row / 3 * 3;i<(row / 3 + 1) * 3;i++)
  10. for(int j=col / 3 * 3;j<(col / 3 + 1) * 3;j++)
  11. if (sudoku[i][j] == val)
  12. return false;
  13. return true;
  14. }

dfs函数遍历整个矩阵求解:

  1. bool dfs(int num) {
  2. int row = num / 9, col = num % 9;
  3. if (num == 81) return true; //找到解,向上传递true信号。
  4. if (sudoku[row][col] != 0) return dfs(num + 1); //若这个格子不是空格,则继续下一格。
  5. for (int val = 1; val < 10; val++) {//在这个格子里试1~9.
  6. if (check(row, col, val)) { //该值val目前可行,那么填进去求解,如果有解则直接停止循环
  7. sudoku[row][col] = val; //并且返回true.否则擦除val,试下一格数字val=val+1.
  8. if (dfs(num + 1)) return true;
  9. sudoku[row][col] = 0;
  10. }
  11. }
  12. return false;
  13. }

主函数:

  1. int main() {
  2. for (int i = 0; i < 81; i++) cin >> sudoku[i / 9][i % 9];//输入。
  3. dfs(0);
  4. for (int i = 0; i < 81; i++) {
  5. cout<< sudoku[i / 9][i % 9];
  6. i % 9 == 8 ? cout << endl : cout << " ";//行末换行,否则后面加空格。
  7. }
  8. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/434300
推荐阅读
相关标签
  

闽ICP备14008679号