zoukankan      html  css  js  c++  java
  • 1.15 构造数独

    编程之美讲了2中构造数独的方法,参照网上已有的代码,整理了一下。

    第一种:回溯法

     1 #include <iostream>
     2 #include "stdlib.h"
     3 #include <time.h>
     4 
     5 #define LEN 9
     6  
     7 using namespace std;
     8 
     9 int CheckData(int array[][LEN],int i,int j)
    10 {
    11     int temp = array[i][j];
    12     int p, q;
    13     int m, n;
    14     
    15     for(p=0; p<9; p++)
    16         if(p!=i && array[p][j]==temp)
    17             return 0;
    18     for(p=0; p<9; p++)
    19         if(p!=j && array[i][p]==temp)
    20             return 0;
    21     p = i/3;
    22     q = j/3;
    23         for(m=p*3; m<p*3+3; m++)
    24             for(n=q*3; n<q*3+3; n++)
    25                 if(m!=i && n!=j && array[m][n]==temp)
    26                     return 0;
    27     return 1;
    28 }
    29 
    30 
    31     
    32 
    33 void main()
    34 {
    35     int sudoku[LEN][LEN] = {0};
    36     int temp = 0;
    37     srand(time(0));
    38     for (int i = 0;i < 9;i++)
    39     {
    40         /*随机产生一个0~81之间的一个数*/
    41         /*在一些随机位置添加一些数*/
    42         temp = rand()%81;
    43         sudoku[temp/9][temp%9]= i+1;
    44     }
    45 
    46     /*第一行第一列开始逐个检查,判断是否满足条件*/
    47     int k = 0;
    48 
    49     while(1)
    50     {
    51         int m = k/9; //行信息
    52         int n = k%9; //列信息
    53         while(1)
    54         {
    55             sudoku[m][n]++;
    56             if (sudoku[m][n] == 10)
    57             {
    58                 sudoku[m][n] = 0;
    59                 --k;
    60                 break; 
    61             }
    62             else if (CheckData(sudoku,m,n))
    63             {
    64                 ++k;
    65                 break;
    66             }
    67 
    68             if (k == 81)
    69             break;
    70             
    71             
    72         }
    73         if (k == 81)
    74             break;
    75 
    76     }
    77 
    78     //显示数据
    79 
    80     while(1)
    81     {
    82         for (i =0;i<9;i++)
    83         {
    84             for (int j = 0;j <9;j++)
    85             {
    86                 cout<<' '<<' '<<' '<<sudoku[i][j];
    87             }
    88             cout<<endl;
    89         }
    90         if ( i == 9)
    91             break;
    92             
    93 
    94             
    95     }
    96 }
    97     

    第二种: 矩阵替换

    随机在中间产生一个矩阵,然后分别变换行列就可以。代码思路比较简单,不再列述。

  • 相关阅读:
    堆排序算法
    归并排序的递归算法与非递归
    二叉排序树(BST)的建立
    枚举排列的两种常见方法
    UVa 439骑士的移动(BFS)
    UVa 二叉树重建(先序+中序求后序)
    UVa 四叉树
    UVa 10562看图写树(二叉树遍历)
    JDBC(6)事务处理&批量处理
    JDBC(5)ResSetMetaData&DatabaseMetaData&获取数据库主键的值
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2613936.html
Copyright © 2011-2022 走看看