zoukankan      html  css  js  c++  java
  • 数独

    数独(すうどく,Sudoku)是一种逻辑性的数字填充游戏。玩家需要根据 9×9 方格上的已知数字,推理出所有剩余空格的数字,使其满足每一行、列、宫中的数字均含1-9,不重复。游戏设计者会提供一部份数字,使其有且仅有一个答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

    以下是使用回溯法求解数独问题的 C++ 实现代码:

     1 /**************************************************************
     2 problem : 回溯法求解数独问题
     3 author  : 林秋伟
     4 time    : 2013-10-29
     5 **************************************************************/
     6 #include <iostream>
     7 #include <cstring>
     8 using namespace std;
     9 
    10 int sudoku[10][10];     //sudoku[i][j]用于存储第i行,第j列的数字
    11 bool row[10][10];       //row[i][num]用于标识第i行是否出现数字num
    12 bool col[10][10];       //col[i][num]用于标识第i列是否出现数字num
    13 bool grid[4][4][10];    //grid[ith][jth][num]用于标识第ith行,第jth列的宫(3×3)是否出现数字num
    14 
    15 //搜索方向:1,1 -> 1,9 -> 2,1 -> 2,9 -> ... -> 9,1 -> 9,9
    16 bool DFS(int x, int y){
    17     if(x==10) return 1;
    18     bool flag=0;
    19     if(sudoku[x][y]!=0){
    20         if(y==9) flag=DFS(x+1, 1);
    21         else flag=DFS(x, y+1);
    22         if(flag) return 1;
    23     }
    24     else{
    25         int ith=(x+2)/3;
    26         int jth=(y+2)/3;
    27         for(int num=1; num<=9; num++){
    28             if(!row[x][num] && !col[y][num] && !grid[ith][jth][num]){
    29                 sudoku[x][y]=num;
    30                 row[x][num]=1;
    31                 col[y][num]=1;
    32                 grid[ith][jth][num]=1;
    33                 if(y==9) flag=DFS(x+1, 1);
    34                 else flag=DFS(x, y+1);
    35                 if(flag) return 1;
    36                 //回溯
    37                 sudoku[x][y]=0;
    38                 row[x][num]=0;
    39                 col[y][num]=0;
    40                 grid[ith][jth][num]=0;
    41             }
    42         }
    43     }
    44     return 0;
    45 }
    46 
    47 int main(){
    48     int i, j;
    49     memset(row, 0, sizeof(row));
    50     memset(col, 0, sizeof(col));
    51     memset(grid, 0, sizeof(grid));
    52     //按照从左到右,从上到下的顺序输入,要填的位置用0代替
    53     for(i=1; i<=9; i++){
    54         for(j=1; j<=9; j++){
    55             cin>>sudoku[i][j];
    56             int num=sudoku[i][j];
    57             if(num!=0){
    58                 row[i][num]=1;
    59                 col[j][num]=1;
    60                 int ith=(i+2)/3;
    61                 int jth=(j+2)/3;
    62                 grid[ith][jth][num]=1;
    63             }
    64         }
    65     }
    66     DFS(1, 1);
    67     cout<<"the solution is:"<<endl;
    68     for(i=1; i<=9; i++){
    69         cout<<sudoku[i][1];
    70         for(j=2; j<=9; j++) cout<<" "<<sudoku[i][j];
    71         cout<<endl;
    72     }
    73     return 0;
    74 }
    75 /**************************************************************
    76 TestCase
    77 Input:
    78 5 3 0 0 7 0 0 0 0
    79 6 0 0 1 9 5 0 0 0
    80 0 9 8 0 0 0 0 6 0
    81 8 0 0 0 6 0 0 0 3
    82 4 0 0 8 0 3 0 0 1
    83 7 0 0 0 2 0 0 0 6
    84 0 6 0 0 0 0 2 8 0
    85 0 0 0 4 1 9 0 0 5
    86 0 0 0 0 8 0 0 7 9
    87 Output:
    88 the solution is:
    89 5 3 4 6 7 8 9 1 2
    90 6 7 2 1 9 5 3 4 8
    91 1 9 8 3 4 2 5 6 7
    92 8 5 9 7 6 1 4 2 3
    93 4 2 6 8 5 3 7 9 1
    94 7 1 3 9 2 4 8 5 6
    95 9 6 1 5 3 7 2 8 4
    96 2 8 7 4 1 9 6 3 5
    97 3 4 5 2 8 6 1 7 9
    98 **************************************************************/
  • 相关阅读:
    Ubuntu18.04安装PHP7.3
    常用的正则表达式大全
    python实现感知机线性分类模型
    Python-基于向量机SVM的文本分类
    ssh远程登录命令简单实例
    js页面间通信方法(storage事件)(浏览器页面间通信方法)
    Node Sass could not find a binding for your current environment 解决办法
    git上传遇到 GitHub could not read Username 的解决办法
    Vue新手村之新手村概述
    Vue新手村任务之任务前言
  • 原文地址:https://www.cnblogs.com/notonlycodeit/p/3395128.html
Copyright © 2011-2022 走看看