基于C语言的9*9数独生成器

题目要求如下图所示:


我们采用的思路是首先生成一个完整的9*9数独,然后再随机挖空,这样就形成了一个数独局面。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>int sudo[9][9], hole[9][9];bool set(int x, int y, int val)
{if (sudo[y][x] != 0)      return false;int x0, y0;for (x0=0; x0<9; x0++){if (sudo[y][x0] == val) return false;}for (y0=0; y0<9; y0++){if (sudo[y0][x] == val) return false;}for (y0=y/3*3; y0<y/3*3+3; y0++){for(x0=x/3*3; x0<x/3*3+3; x0++){if (sudo[y0][x0] == val) return false;}}sudo[y][x] = val;return true;
}void reset(int x, int y)
{sudo[y][x] = 0;
}void initXOrd(int* xOrd)
{int i, k, tmp;for (i=0; i<9; i++){xOrd[i] = i;}for (i=0; i<9; i++){k = rand() % 9;tmp = xOrd[k];xOrd[k] = xOrd[i];xOrd[i] = tmp;}
}bool fillFrom(int y, int val)
{int xOrd[9];initXOrd(xOrd);   for (int i=0; i<9; i++){int x = xOrd[i];if (set(x, y, val)){if (y == 8)               {if (val == 9 || fillFrom(0, val+1)) return true;} else{if (fillFrom(y+1, val))return true;}reset(x, y);   }}return false;
}void digHole(int holeCnt)
{int idx[81];int i, k;for (i=0; i<81; i++){hole[i / 9][i % 9] = 0;idx[i] = i;}for (i=0; i<holeCnt; i++)  {k = rand() % 81;int tmp = idx[k];idx[k] = idx[i];idx[i] = tmp;}for (i=0; i<holeCnt; i++){hole[idx[i] / 9][idx[i] % 9] = 1;}
}void printSudo()
{for (int y=0; y<9; y++){if(y%3==0)printf("-------------------------\n| ");elseprintf("| ");for (int x=0; x<9; x++){if(hole[y][x] == 0)printf("%d ",sudo[y][x]);elseprintf("  ");if(x%3==2)printf("| ");elseprintf("");}printf("\n");}printf("-------------------------\n");
}int main(int argc, char* argv[])
{   int n,m;printf("填空数目M=(X+1)*10,请输入难度等级X 1~3:\n");scanf("%d",&n);m=(n+1)*10;srand((unsigned)time(NULL));while (!fillFrom(0, 1)) ;digHole(m);printSudo();return 0;
}

运行结果如下图所示:

         空缺数是对应难度+1的十倍,比如难度2是空缺30个数


整体思路:
1.在我们的思路中,我们先要生成一个完整的数独数组sudo[9][9],然后再随机挖洞,空出指定数目的空,形成hole[9][9],这就是我们生成的数独游戏。
2.用回溯法进行填数,保证没有重复项,满足数独要求。

从算法而言,整体是一个回溯算法:

1)初始化数据结构。

2)设置long_row进入第一行,设置一个随机开始列xl和y。

3)如果没有到达最后一行,则继续搜索。

4)从当前搜索列y开始,查找可放置的列位置,找到则放置在该位置(并更新y),并转入下一行的搜索。

5)如果没有找到,则回溯到上一行。

6)全部数字放置完毕后,结束循环。

基于C语言的9*9数独生成器(回溯法)相关推荐

  1. python数独伪代码回溯法_数独的暴力回溯解法和Python GUI

    数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵,20世纪70年代,经过美国及日本学者的推广和改良,定名为数独(Sudoku),大致的意思是"独个的数字"或"只出现一 ...

  2. python数独伪代码回溯法_数独 #回溯算法 #CTF

    1. intro:巅峰极客的一道逆向 刷巅峰极客2020里的rev题fu!kpy,复杂得不行但是看到if d[1][0] != '8' or d[1][7] != '2'和if check(h1) ! ...

  3. 旅行商问题c语言,【算法作业】用回溯法求解旅行商问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define N 6 #define MAX 10000 int bestc=MAX; int cc=0; int ...

  4. C语言学习日记(12)——回溯法解迷宫(1)

    走迷宫是一种经典的智力游戏,相信很多人都玩过.我们走迷宫的过程一般是这样的:从入口开始尝试,如果走到某个位置有几种方案可以选择,则选择其中的一种方案进行尝试,不断重复这个过程.如果走不通,就回退到前一 ...

  5. python回溯法解9*9数独

    文章目录 前言 一.回溯法解数独代码 总结 前言 看了labuladong算法小抄里的回溯法,照着模板,加入自己的理解,用python做了个解9*9数独的回溯法,. 一.回溯法解数独代码 直接上代码: ...

  6. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  7. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)

    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...

  8. 基于Erlang语言的视频相似推荐系统 | 深度

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...

  9. livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程

    敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...

最新文章

  1. 搜推广遇上用户画像:Lookalike相似人群拓展算法
  2. 大学阶段总结——大三
  3. TensorFlow(九)eval函数
  4. PL/SQL工具执行SQL脚本文件
  5. 世外桃源六python_六年匠心 桃花源记6月1日全民狂欢
  6. Bootstrap3 面板 .panel 容器
  7. 支付宝:“答答星球”小程序上线20天累计参与人数超2亿
  8. docker下gitlab安装配置使用
  9. 设计模式之三:观察者模式
  10. 我在安装TFS 2008的时候遇到的问题以及解决方法一账户问题
  11. Linux下产生coredump并压缩保存
  12. 你所不知道的Redis热点问题以及如何发现热点
  13. Android进程管理
  14. 网络TCP/IP基础(IP地址网络汇总与规划)
  15. 在Linux上配置基于Web的网络流量监控系统的方法
  16. 安全赋能区域数字化转型,普陀区副区长徐树杰带队调研上海控安
  17. Ubuntu U盘启动盘制作步骤
  18. sql2java-excel(二):基于apache poi实现数据库表的导出的spring web支持
  19. 【Golang 中的 type A = XXX 与 type A XXXX的区别】
  20. 一个屌丝程序猿的人生(四十四)

热门文章

  1. WEB - 作业(1)
  2. 计算机原理实验红绿灯转换,微机原理实验交通灯控制实验.doc
  3. Haozi的嵌入式攻城狮修炼历程
  4. 满庭芳国色 高清剪图 桃红 上
  5. Oracle EBS 付款后无法创建会计科目
  6. 云智信短信验证码php示例
  7. slack软件怎么用
  8. AUTOSAR OS和OSEK OS
  9. 影响100年的营销启示 24个故事
  10. “三高“Mysql - Mysql备份概览