构造数独 算法及代码实现

简介:

问题:

构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。

 

首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。

 

    1. #include<iostream>  
    2. #include<cstdlib>  
    3. usingnamespace std;  
    4.  
    5. #define LEN 9  
    6. #define CLEAR(a) memset((a),0,sizeof(a))  
    7.  
    8. int level[]={30,37,45};  
    9.  
    10. int grid[LEN+1][LEN+1];  
    11. int value[LEN+1];  
    12.  
    13. voidnext(int&x,int&y)  
    14. {  
    15.     x++;  
    16.     if(x>9)  
    17.     {  
    18.         x =1;  
    19.         y++;  
    20.     }  
    21. }  
    22.  
    23. // 选择下一个有效状态  
    24. int pickNextValidValue(int x,int y,int cur)  
    25. {  
    26.     CLEAR(value);  
    27.     int i, j;  
    28.     for(i=1; i<y; i++)  
    29.         value[grid[i][x]]=1;  
    30.     for(j=1; j<x; j++)  
    31.         value[grid[y][j]]=1;  
    32.     int u =(x-1)/3*3+1;  
    33.     int v =(y-1)/3*3+1;  
    34.     for(i=v; i<v+3; i++)  
    35.         for(j=u; j<u+3; j++)  
    36.         {  
    37.             value[grid[i][j]]=1;  
    38.         }  
    39.     for(i=cur+1; i<=LEN && value[i]; i++);  
    40.     return i;  
    41. }  
    42.  
    43. void pre(int&x,int&y)  
    44. {  
    45.     x--;  
    46.     if(x<1)  
    47.     {  
    48.         x =9;  
    49.         y--;  
    50.     }  
    51. }  
    52.  
    53. int times =0;  
    54.  
    55. int main()  
    56. {  
    57.     int x, y, i, j;  
    58.     x = y =1;  
    59.     // 深度搜索的迭代算法  
    60.     while(true)  
    61.     {  
    62.         times++;  
    63.         // 满足成功结果  
    64.         if(y==LEN && x==LEN)  
    65.         {  
    66.             for(i=1; i<=LEN; i++)  
    67.             {  
    68.                 for(j=1; j<=LEN; j++)  
    69.                     cout << grid[i][j]<<" ";  
    70.                 cout << endl;  
    71.             }  
    72.             cout << times << endl;  
    73.             break;  
    74.             //pre(x, y);  
    75.             //times = 0;  
    76.         }  
    77.         // 满足失败结果  
    78.         if(y==0)  
    79.             break;  
    80.         // 改变状态  
    81.         grid[y][x]= pickNextValidValue(x, y, grid[y][x]);  
    82.         if(grid[y][x]> LEN)  
    83.         {  
    84.             // 恢复状态  
    85.             grid[y][x]=0;  
    86.             pre(x, y);  
    87.         }  
    88.         else  
    89.             // 进一步搜索  
    90.             next(x,y);  
    91.     }  
    92.     for(i=1; i<= level[2]; i++)  
    93.     {  
    94.         int ind = rand()%(LEN*LEN);  
    95.         grid[ind/LEN+1][ind%LEN]=0;  
    96.     }  
    97.     for(i=1; i<=LEN; i++)  
    98.     {  
    99.         for(j=1; j<=LEN; j++)  
    100.             cout << grid[i][j]<<" ";  
    101.         cout << endl;  
    102.     }  
    103. }  

本文转自博客园知识天地的博客,原文链接:构造数独 算法及代码实现,如需转载请自行联系原博主。

相关文章
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
84 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
58 3
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
309 65
|
3月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
3月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
38 0