思路

利用穷举法

C语言代码

#include

//负责输出二维数组的一行,并给数组添加格式

void row_output(int i, int x[9][9])

{

int j, flag;

for (j = 0; j < 9; j++)

{

//检查是否为3的倍数

flag = (j + 1) % 3;

//当是3的倍数时加入两个空格

if (flag == 0)

printf("%d ", x[i][j]);

//否则加入一个空格

else

printf("%d ", x[i][j]);

}

}

//负责按照九宫格的形式将数组输出

void output(int x[9][9])

{

int i, flag;

for (i = 0; i < 9; i++)

{

//检查是否为3的倍数

flag = (i + 1) % 3;

row_output(i, x);

//当是3的倍数时加入两个空行

if (flag == 0)

printf("\n\n");

//否则加入一个空行

else

printf("\n");

}

}

//validate函数负责检查下x[i][j]是否为可行的值

int validate(int x[9][9], int i, int j, int num)

{

int row, column;

int isPossible = 1;

//遍历第i行查询是否有重复的值

for (column = 0; column < 9; column++)

{

if (num == x[i][column]) isPossible *= 0;

else isPossible *= 1;

}

//遍历第j列查询是否有重复的值

for (row = 0; row < 9; row++)

{

if (num == x[row][j]) isPossible *= 0;

else isPossible *= 1;

}

//遍历x[i][i]所在宫(box)查询是否有重复的值

int box_i, box_j;

//定位宫的位置

int offset_x, offset_y;

//计算x方向(即j序号增加方向)偏移量

offset_x = j - j % 3;

//计算y方向(即i序号增加方向)偏移量

offset_y = i - i % 3;

for (box_i = 0; box_i < 3; box_i++)

{

for (box_j = 0; box_j < 3; box_j++)

{

//将box_i,box_j修正到正确的九宫格

if (num == x[box_i + offset_y][box_j + offset_x]) isPossible *= 0;

else isPossible *= 1;

}

}

//验证无误返回1,否则返回0

return isPossible;

}

void solve_soduku(int x[9][9])

{

int i, j, num, flag=0;

//新建一个二维数组负责记录不可更改数字(即开始时就被填入的数字)的位置

int can_not_modify[9][9] = { 0 };

for (i = 0; i < 9; i++)

{

for (j = 0; j < 9; j++)

{

if (x[i][j] != 0) can_not_modify[i][j] = 1;

}

}

//初始化i和j

i = 0;

j = 0;

//遍历九宫格,从x[0][0]开始尝试

while (i < 9)

{

while (j < 9)

{

//判断是否为上一行试错跳转而来

start:if (flag == 1 && j == -1)

{

i--;

j = 8;

goto start;

}

//判断是否为试错跳转而来且当前值不可修改

else if (flag == 1 && can_not_modify[i][j] == 1)

{

//继续返回上一层

j--;

continue;

}

//判断当前格子是否不可修改

else if (can_not_modify[i][j] == 1)

{

j++;

continue;

}

//开始尝试

else

{

num = x[i][j];

//若当前格子还未赋值,即不是由上一次试错跳转而来,从1开始尝试

if (num == 0) num = 1;

//若flag==1即是由上一次试错而来,从上一次错误的值+1继续尝试

else if (flag == 1) num = x[i][j] + 1;

//初始化跳转标识的值

flag = 0;

//从num开始向后逐个尝试

for (; num <= 10; num++)

{

//用validate函数判断尝试的值是否可行

//如果可行将当前格子的值变为num

if (validate(x, i, j, num) == 1 && num < 10)

{

x[i][j] = num;

j++;

break;

}

//如果到9还没有可行的值填入,说明前面有错,初始当前值为0,返回上一次尝试

else if (num == 10)

{

x[i][j] = 0;

j--;

//打上跳转标识flag=1

flag = 1;

break;

}

}

}

}

//一行填满从下一行第一个继续尝试

j = 0;

i++;

}

}

void main()

{

int i, j;

char temp;

int soduku[9][9];

printf("数独求解V0.1 by:Clysto\n2018/6/20\n\n\n");

printf("请输入您要求解的数独:\n");

printf(" 123456789\n");

for (i = 0; i < 9; i++)

{

printf("%d:", i + 1);

for (j = 0; j < 10; j++)

{

temp = getchar();

if (j<9) soduku[i][j] = temp - '0';

}

}

printf("\n您输入的数独是:\n");

output(soduku);

solve_soduku(soduku);

printf("结果是:\n");

output(soduku);

}

c语言程序设计数独,C语言求解数独相关推荐

  1. 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  2. 《C语言程序设计:问题与求解方法》——3.9节常见编程错误

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.9节常见编程错误,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 3.9 ...

  3. 《C语言程序设计:问题与求解方法》——1.4节本章习题

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第1章,第1.4节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 一 ...

  4. 《C语言程序设计:问题与求解方法》——0.5节本章习题

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第0章,第0.5节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 1 ...

  5. 用C语言编写从A到Z随机步法,实用C语言程序设计教程1C语言学习基础ppt71.ppt

    实用C语言程序设计教程1C语言学习基础ppt71 C语言程序设计 - 第1章 C语言学习基础 第1章 开篇 --C语言学习基础 --目标既不是精确的,也不是预先设定的,目标应是一般性的.生成性的,从而 ...

  6. c语言小饭店等位就餐程序,C语言程序设计 C语言程序设计 3.C语言程序设计教案全部.doc...

    C语言程序设计教案 PAGE PAGE 2 C语言程序设计教案 C语言程序设计教案 编写:宋铁桥 计算机技术系 二〇一七年三月整理 河北工业职业技术学院 <C语言程序设计>课程教案首页 授 ...

  7. dsp c语言程序设计,DSP C语言程序设计.pdf

    第13章 DSP程序设计 主要内容: (1)DSP C语言程序设计 (2)C语言与汇编语言混合编程 (3)DSP程序烧写 13.1 DSP C语言程序设计 DSP支持使用ANCI C进行程序设计,并提 ...

  8. 现代C语言程序设计之C语言概述

    现代C语言程序设计之C语言概述 现代C语言程序设计 1.1 信息技术发展趋势 目前信息技术主要经历了互联网.移动互联网以及以大数据.云计算.物联网.人工智能.区块链为代表的新兴技术三个阶段. 互联网 ...

  9. C语言程序设计题/C语言计算机二级考前押题版

    C语言程序设计题/C语言计算机二级考试押题版 与 数位 和 数 有关 求max与min 任意四个数 运算符和表达式版本 #include <stdio.h> int main( ) {in ...

  10. c语言程序设计河北,C语言程序设计

    C语言程序设计是计算机专业学生的专业基础课程,也可以作为非计算机专业学生的程序设计课程,它是后续相关专业课程的基础:本课程通过面向过程的程序设计方法,培养学生计算思维和程序实现能力,从而能更好地利用计 ...

最新文章

  1. The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.0 and higher.
  2. 机器学习入门(01)— 感知机概念、实现、局限性以及多层感知机
  3. 如何划分155MSDH带宽
  4. NVIDIA Jetson TX2使用
  5. FPGA之道(58)关于外界接口的编程思路
  6. 新手理解的JS原型链
  7. Linux之cut:简化版的awk
  8. Java Swing中的聊天气泡
  9. 近40万辆奥迪车被召回,有你的吗?
  10. c++与unreal 的uc脚本交互
  11. Jquery Cookbook摘要之使用上下文参数
  12. python实现给定一个列表和数字,在列表找到和为该数字的元素返回下标
  13. Java设计模式之适配器模式详解
  14. 解决maven中ojdbc14:11.2.0.1.0错误
  15. Abaqus 用户子程序 UEL
  16. idea 使用中文汉化包教程
  17. win7加入网络计算机,win7怎么加入局域网工作组_win7加入局域网工作组的步骤
  18. seo单页html模板,竞价单页模板设计思路
  19. VMware SDS之十: VMware SPBM之SolidFire篇
  20. 聚焦质控 | 如何进行单病种过程质量管理

热门文章

  1. 软件开发工程师工作总结(转)
  2. 积沙成塔之VC不规则按钮的创建
  3. 新世纪Nerv战士 - 京东首页补完计划
  4. rust怎么上邮轮_实拍沉入海底的泰坦尼克号:被海水腐蚀严重,船体将于10年后消失...
  5. Chrome浏览器本地调试:阻止不安全、本地网络请求
  6. Jar包常见的反编译工具介绍与使用
  7. 实战八:美国人口普查数据进行收入预测分类
  8. nuc8 macos12升级测试
  9. Linux三剑客练习
  10. 类的继承——cancas绘制五彩小球