• 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 表示
    ";
     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

  • 相关阅读:
    001-导航条悬浮顶部
    000-导航栏单击事件背景变换
    1-MySQL命令行
    了解CentOS服务器的基本信息
    SecureCRT配色
    SecureCRT中文显示乱码
    Android Studio 1.1 使用介绍及导入 jar 包和第三方依赖库
    Android Json 解析
    不断更新中 书签
    Android 常用的权限
  • 原文地址:https://www.cnblogs.com/nanshaobit/p/cpp-sudoku-game.html
Copyright © 2020-2023  润新知