c语言程序设计数独,C语言求解数独
思路
利用穷举法
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语言求解数独相关推荐
- 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...
- 《C语言程序设计:问题与求解方法》——3.9节常见编程错误
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.9节常见编程错误,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 3.9 ...
- 《C语言程序设计:问题与求解方法》——1.4节本章习题
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第1章,第1.4节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 一 ...
- 《C语言程序设计:问题与求解方法》——0.5节本章习题
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第0章,第0.5节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 1 ...
- 用C语言编写从A到Z随机步法,实用C语言程序设计教程1C语言学习基础ppt71.ppt
实用C语言程序设计教程1C语言学习基础ppt71 C语言程序设计 - 第1章 C语言学习基础 第1章 开篇 --C语言学习基础 --目标既不是精确的,也不是预先设定的,目标应是一般性的.生成性的,从而 ...
- c语言小饭店等位就餐程序,C语言程序设计 C语言程序设计 3.C语言程序设计教案全部.doc...
C语言程序设计教案 PAGE PAGE 2 C语言程序设计教案 C语言程序设计教案 编写:宋铁桥 计算机技术系 二〇一七年三月整理 河北工业职业技术学院 <C语言程序设计>课程教案首页 授 ...
- dsp c语言程序设计,DSP C语言程序设计.pdf
第13章 DSP程序设计 主要内容: (1)DSP C语言程序设计 (2)C语言与汇编语言混合编程 (3)DSP程序烧写 13.1 DSP C语言程序设计 DSP支持使用ANCI C进行程序设计,并提 ...
- 现代C语言程序设计之C语言概述
现代C语言程序设计之C语言概述 现代C语言程序设计 1.1 信息技术发展趋势 目前信息技术主要经历了互联网.移动互联网以及以大数据.云计算.物联网.人工智能.区块链为代表的新兴技术三个阶段. 互联网 ...
- C语言程序设计题/C语言计算机二级考前押题版
C语言程序设计题/C语言计算机二级考试押题版 与 数位 和 数 有关 求max与min 任意四个数 运算符和表达式版本 #include <stdio.h> int main( ) {in ...
- c语言程序设计河北,C语言程序设计
C语言程序设计是计算机专业学生的专业基础课程,也可以作为非计算机专业学生的程序设计课程,它是后续相关专业课程的基础:本课程通过面向过程的程序设计方法,培养学生计算思维和程序实现能力,从而能更好地利用计 ...
最新文章
- The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.0 and higher.
- 机器学习入门(01)— 感知机概念、实现、局限性以及多层感知机
- 如何划分155MSDH带宽
- NVIDIA Jetson TX2使用
- FPGA之道(58)关于外界接口的编程思路
- 新手理解的JS原型链
- Linux之cut:简化版的awk
- Java Swing中的聊天气泡
- 近40万辆奥迪车被召回,有你的吗?
- c++与unreal 的uc脚本交互
- Jquery Cookbook摘要之使用上下文参数
- python实现给定一个列表和数字,在列表找到和为该数字的元素返回下标
- Java设计模式之适配器模式详解
- 解决maven中ojdbc14:11.2.0.1.0错误
- Abaqus 用户子程序 UEL
- idea 使用中文汉化包教程
- win7加入网络计算机,win7怎么加入局域网工作组_win7加入局域网工作组的步骤
- seo单页html模板,竞价单页模板设计思路
- VMware SDS之十: VMware SPBM之SolidFire篇
- 聚焦质控 | 如何进行单病种过程质量管理