算法之DFS数独游戏
1 #include <iostream> 2 3 using namespace std; 4 5 int num[9][9];//用于保存9x9盘面 6 bool flag = false;//flag为true时表示推算完成,结束递归 7 8 bool check(int n){//判断当前位置的值是否满足条件 9 int h = n / 9;//行号 10 int l = n % 9;//列号 11 for (int i = 0; i < 9; ++i){//同一列中不能有重复 12 if (i != h && num[i][l] == num[h][l]){ 13 return false; 14 } 15 } 16 for (int j = 0; j < 9; ++j){//同一行中不能有重复 17 if (j != l && num[h][j] == num[h][l]){ 18 return false; 19 } 20 } 21 for (int i = h / 3 * 3; i < h / 3 * 3 + 3; ++i){//九宫格内不重复 22 for (int j = l / 3 * 3; j < l / 3 * 3 + 3; ++j){ 23 if ((i != h || j != l) && num[i][j] == num[h][l]){ 24 return false; 25 } 26 } 27 } 28 return true; 29 } 30 31 void dfs(int n) 32 { 33 if (n == 81){//如果已经递归到右下角,输出整个盘面,并置flag为true,结束递归 34 for (int i = 0; i < 9; ++i){ 35 for (int j = 0; j < 8; ++j){ 36 cout << num[i][j] << ' '; 37 } 38 cout << num[i][8] << endl; 39 } 40 flag = true; 41 return; 42 } 43 int h = n / 9;//行号 44 int l = n % 9;//列号 45 if (num[h][l] == 0){//如果当前位置为0,说明需要推算 46 for (int i = 1; i <= 9; ++i){//枚举1-9的数字,判断哪个满足条件 47 num[h][l] = i; 48 if (check(n)){//判断当前数字是否满足条件 49 dfs(n + 1);//如果满足条件继续往下递归 50 if (flag){//如果flag为true表示整个盘面的递归结束了 51 return; 52 } 53 } 54 } 55 num[h][l] = 0;//需要回溯,恢复num[h][l]的值为0 56 }else{//当前位置不为0,往下一格递归 57 dfs(n + 1); 58 } 59 } 60 61 int main() 62 { 63 for (int i = 0; i < 9; ++i){ 64 for (int j = 0; j < 9; ++j){ 65 cin >> num[i][j];//输入9x9盘面 66 } 67 } 68 dfs(0);//从左上角开始递归 69 return 0; 70 }
主要为了自己学习