C语言解数独

一、计划解法

  • 对于常规的数独,通常人类是先寻找最简单的、可唯一确定填入数的空先填入,对于可能存在分支情况的,先标记,填入待定数,在填写过程中确认。
  • 对于计算机而言,考虑分支情况的复杂数独,需要采用图 或者 数
    一类的结构,实际代码较为复杂,故此次采用反复遍历,试数的方法,虽然策略不算最优,但借助计算机的强大算力,解出结果的速度仍然很快。

二、解决方案中的几个知识点

  • 二维数组
    -数组的初始化是可以将大量数据同时存入,而在后续过程中,一次只能访问一个地址对应的数据。
  • 数组指针
    -数组指针,即指向数组的指针。
    -一维数组,数组名就是指针名,即*(a+i)== a【i】
    -二维数组,数组名是其低维头指针的头指针,即* (a+i)是其第i个高维数组指针,即(*(a+i))【j】== a【i】【j】
  • 指针传递
    -在二维数组指针传递过程中,低维元素个数必须确定,可采取
int Input(int (*p)[n]);//声明函数,n是低维元素数,确定数int main(){int A[9][9]={0};Input(A);//主函数中的调用和参数传递}
  • switch控制
    -在多个循环嵌套的运算中,合理调用switch函数,能过有效增加代码可读性
    -例如,在分别检查 行、列、九宫格 重复元素的过程中,使用循环嵌套,运算效率低,而且控制条件过多,容易出现问题。
for(...)//行检查...for(...)//列检查...for(...)//九宫格检查(实际九宫格检查需要两层循环)
switch(1){case 1:for(...)...//行检查
case 2:for(...)...//列检查
case 3:for(...)...//九宫格检查
default :...//数字可能适配

三、主函数和头文件

#include<stdio.h>int Input(int (*p)[n]);
int Output(int (*p)[n]);//函数声明
int Fill(int (*p)[n]);
int main(){int A[9][9]={0};//数组初始化Input(A);//输入Fill(A);//填充Output(A);//输出return 0;
}

四、函数

输入函数:

int Input(int(* mat)[9]) {printf("请按行输入数字(无数字输入0,空格间隔,回车换行):\n");for (int i = 0; i < 9; i++) {printf("第%d行:", i + 1);for (int j = 0; j < 9; j++) {scanf_s("%d", &(*(mat + i))[j]);}}return 0;
}

填充函数:

int Fill(int(*mat)[9]) {int fin = 1;while (fin) {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if ((*(mat + i))[j]) continue;//非0元素跳过填充int x = 0;//x用来判别n是否出现过int i_f = 3 * (i / 3);//元素对应九宫格行首int j_f = 3 * (j / 3);//元素对应九宫格列首int num=0;for (int n = 1; n < 10; n++) {int twice = 0;switch (1) {case 1:for (int k = 0; k < 9; k++)//行检查{if ((*(mat + i))[k] == n) twice = 1;}if (twice == 1) break;case 2:for (int k = 0; k < 9; k++)//列检查{if ((*(mat + k))[j] == n) twice = 1;}if (twice == 1) break;case 3:for (int k = 0; k < 3; k++) {for (int l = 0; l < 3; l++) {if ((*(mat + i_f + k))[j_f + l] == n) twice = 1;}}if (twice == 1) break;default:x++;num = n;break;}}if (x == 1) (*(mat + i))[j] = num;printf("Complex!\n");}printf("Too complex!\n");}int min = 1;for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if ((*(mat + i))[j] < min) min = 0;}}if (min == 1) fin = 0;printf("Too too complex!\n");}return 0;
}

输出函数:

int Output(int(*mat)[9]) {printf("结果为:\n");for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {printf("%d ", (*(mat + i))[j]);}printf("\n");}return 0;
}

C语言解数独(含源码) 2020/8/19相关推荐

  1. C语言——解数独程序[源码]

    用C语言写的解数独的程序.在linux下测试成功运行. 效果如图: 这是带解的数独,需要填写的部分用数字0代替. 这是程序运行后的效果图.看看,数独已经搞定啦--- 程序源码如下: #include ...

  2. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  3. Unity UGUI Batches合批规则详解(含源码)

    Unity UGUI Batches合批规则详解 在处理UGUI DrawCall问题的时候,我们经常遇到各式各样的问题. 问题1:在处理UGUI合批的时候,发现了一个面板父节点发生旋转,底下的UI合 ...

  4. ADI Blackfin DSP处理器-BF533的开发详解55:CVBS输入-DSP和ADV7180的应用详解(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 CVBS IN 视频输入 硬件实现原理 CVB ...

  5. 老男孩GO语言线下培训班1期整套教程(完整18天含源码)

    老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │      01 Go开发1期 day1 ...

  6. Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)

    文章目录 一.翻译程序示例图 二.流程须知(个人理解) 三.关于对话框中QDialogButtonBox翻译的操作 四.源码 CLinguistTest.h CLinguistTest.cpp CLi ...

  7. 【Matlab数字识别】数字仪表图像识别【含源码 693期】

    一.代码运行视频(哔哩哔哩) [Matlab数字识别]数字仪表图像识别[含源码 693期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLAB ...

  8. 【Matlab图像去噪】小波滤波(硬阙值+软阙值)+中值滤波图像去噪【含源码 462期】

    一.代码运行视频(哔哩哔哩) [Matlab图像去噪]小波滤波(硬阙值+软阙值)+中值滤波图像去噪[含源码 462期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  9. 【Matlab瑕疵检测】阙值瓶盖瑕疵检测【含源码 730期】

    一.代码运行视频(哔哩哔哩) [Matlab瑕疵检测]阙值瓶盖瑕疵检测[含源码 730期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLAB ...

  10. Eatting外卖基于瑞吉外卖代码全功能优化含源码

    Eatting外卖基于瑞吉外卖代码全功能优化含源码 文章目录 项目的最终部署 源码地址 github:[源码地址](https://github.com/yangxingyue0623/Eating_ ...

最新文章

  1. 集成学习之Boosting
  2. Java 中文转拼音
  3. CF里面的资源载入问题
  4. RHEL修改最大文件打开数,关于epoll socket Too many open files问题的解决
  5. iOS经典面试题之使用runtime associate方法关联的对象释放及dealloc底层原理
  6. Day 9 函数的初识1
  7. JavaScript-引入JavaScript
  8. 单进程服务器(python版)
  9. 10-C++实现栈的常见操作
  10. 人工智能应用计算机的实例,人工智能应用实例介绍
  11. 威胁web应用安全的错误
  12. Python开发 CDN查询子域名查询
  13. 辉芒微IO单片机FT60F210-URT
  14. canvas画板总结
  15. 在Linux下搭建带MOD 我的世界(Minecraft)服务器
  16. 花三千万写出的十个 to B创业大坑(上)
  17. [译]Vue官方成员:Vite生态发展的怎么样了
  18. Python OpenCV开发MR智能人脸识别打卡系统(三、工具模块设计)
  19. android方向本科毕业设计题目,计算机专业毕业设计题目-安卓类
  20. java导入进度显示_java excel导入获取实时进度

热门文章

  1. iOS wifi互传文件
  2. w10启动无线网服务器,Win10系统怎么开启无线wifi_w10开启wifi图文教程
  3. 纯CSS实现的3D翻页效果
  4. Percent Library百分比布局详解
  5. dhcp服务器在作用,dhcp的作用是什么?dhcp优缺点
  6. 大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
  7. PI3激酶生物学研究丨PI3激酶活性检测试剂盒方案
  8. 在padavan运行wifidog
  9. 建站影视cms网站源码(含安装说明文档)
  10. 路由器连接猫服务器未响应,猫能连上路由器连不上怎么回事【解决方法】