C++ 数独游戏

 

C++ 数独游戏

直接上代码:

  1 // 数独 sudoku 
  2 
  3 #include <iostream>
  4 
  5 using namespace std;
  6 
  7 int P[9][9];
  8 bool flag = false;
  9 
 10 // 处理输入 
 11 void input(){
 12     char t;
 13     cout << "输入棋盘,空用 0 表示\n";
 14     for(int i = 0; i < 9; i ++){
 15         for(int j = 0; j < 9; j ++){
 16             cin >> t;
 17             P[i][j] = t - '0';
 18         }
 19     }
 20 }
 21 
 22 // 处理输出 
 23 void output(){
 24     for(int i = 0; i < 9; i ++){
 25         for(int j = 0; j < 9; j ++){
 26             
 27             if(P[i][j]){
 28                 cout << P[i][j];    
 29             }else{
 30                 cout << " ";
 31             }
 32             
 33             if(j%3 == 2) cout << "  ";
 34         }
 35         if(i%3 == 2) cout << endl;
 36         cout << endl;
 37     }
 38     
 39 }
 40 
 41 // 判断即将放入的 是否符合条件 
 42 bool check(int n, int num){
 43     
 44     //
 45     for(int i = 0; i < 9; i ++){
 46         if(P[n/9][i] == num){
 47             return false;
 48         }
 49     } 
 50     
 51     //
 52     for(int i = 0; i < 9; i ++){
 53         if(P[i][n%9] == num){
 54             return false;
 55         }
 56     } 
 57     
 58     //
 59     int x = n / 9 / 3 * 3;
 60     int y = n % 9 / 3 * 3;
 61     for(int i = 0; i < 3; i ++){
 62         for(int j = 0; j < 3; j ++){
 63             if(P[x+i][y+j] == num){
 64                 return false;
 65             }
 66         }
 67     } 
 68     
 69     return true;
 70 }
 71 
 72 // [n/9][n%9]
 73 void dfs(int n){
 74     
 75     // 成功 
 76     if(n > 80){
 77         flag = true;
 78         return;
 79     }
 80     
 81     int x = n/9, y = n%9;
 82     // 有值 跳过 
 83     if(P[x][y]){
 84         dfs(n+1);
 85         return;
 86     }
 87     // 遍历 
 88     for(int i = 1; i <= 9; i ++){
 89         // 判断 
 90         if(check(n, i)){
 91             // 判断成功 赋值 
 92             P[x][y] = i;
 93             dfs(n+1);
 94             // 退出时判断是否完成  完成时退出 
 95             if(flag){
 96                 return;
 97             }
 98             // 未完成 重置棋盘 
 99             P[x][y] = 0;
100         }
101     }
102 }
103 
104 int main(){
105     input();
106     cout << endl << endl; 
107     dfs(0);
108     output();
109     return 0;
110 } 
111 
112 
113 /*
114 
115 测试用例 
116 
117 170004000
118 360810054
119 008050109
120 007035048
121 000000270
122 000008601
123 000060080
124 700000000
125 000403016
126 
127 */

 

测试用例子结果

在这里插入图片描述

百度百科 世界最难数独

答案秒出, 没有什么是暴力解决不了的~
在这里插入图片描述

楠少博客同步更新:https://blog.nanshaobit.top/95

 

posted @ 2020-01-13 13:41  楠少科技  阅读(1403)  评论(0编辑  收藏  举报