赞
踩
题目:数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
思路:从9×9的数独矩阵的第一格开始,一直求解到最后一格。 每一格都遍历 1~9 这9种数字,并且检查是否合法,如果合法就继续下一格。
变量:数独矩阵sudoku[9][9],以及当前求解的下标num. (行num/9, 列num%9),数独矩阵定义成全局变量,下标作为参数。
int sudoku[9][9];
求单一解,所以dfs函数定义成bool型。
查看当前格子填入当前数字后是否合法:
- bool check(int row, int col, int val)
- {
- 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;
- for(int i=row / 3 * 3;i<(row / 3 + 1) * 3;i++)
- for(int j=col / 3 * 3;j<(col / 3 + 1) * 3;j++)
- if (sudoku[i][j] == val)
- return false;
- return true;
- }
dfs函数遍历整个矩阵求解:
- bool dfs(int num) {
- int row = num / 9, col = num % 9;
- if (num == 81) return true; //找到解,向上传递true信号。
- if (sudoku[row][col] != 0) return dfs(num + 1); //若这个格子不是空格,则继续下一格。
- for (int val = 1; val < 10; val++) {//在这个格子里试1~9.
- if (check(row, col, val)) { //该值val目前可行,那么填进去求解,如果有解则直接停止循环
- sudoku[row][col] = val; //并且返回true.否则擦除val,试下一格数字val=val+1.
- if (dfs(num + 1)) return true;
- sudoku[row][col] = 0;
- }
- }
- return false;
- }
主函数:
- int main() {
- for (int i = 0; i < 81; i++) cin >> sudoku[i / 9][i % 9];//输入。
- dfs(0);
- for (int i = 0; i < 81; i++) {
- cout<< sudoku[i / 9][i % 9];
- i % 9 == 8 ? cout << endl : cout << " ";//行末换行,否则后面加空格。
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。