来自:http://my.oschina.net/lovewxm/blog/288043?p=1

 #include <stdio.h>
#include <stdlib.h> #define BOOL int
#define FALSE 1
#define TRUE 0 typedef struct node
{
int col;
int row;
int value[];
} Node; int findvalue(int sudoku[][], Node * node);
BOOL general_inspection(int sudoku[][]);
int blank_num(int sudoku[][]);
Node * mem_alloc(int num_of_empty);
void trace(int sudoku[][], Node * node_stack, int num_of_empty);
void print_sudoku(int sudoku[][]); int main(void)
{
int sudoku[][] = {{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,}
}; int num_of_empty;
//为回溯栈分配空间
Node * node_stack; if(general_inspection(sudoku))
{
printf("此数独存在错误!请检查\n");
print_sudoku(sudoku);
return ;
}
num_of_empty = blank_num(sudoku);
node_stack = mem_alloc(num_of_empty);
trace(sudoku, node_stack, num_of_empty);
print_sudoku(sudoku); return ;
} BOOL general_inspection(int sudoku[][])
{
int temp[] = {, , , , , , , , , };
int i, j, m, n;
for(i=; i<; i++)
for(j=; j<; j++)
if(sudoku[i][j]!=)
{
//检查所在行
for(m=; m<; m++)
temp[m] = ;
for(m=; m<; m++)
if(sudoku[i][m]!=)
{
if(temp[sudoku[i][m]]==)
temp[sudoku[i][m]] = ;
else
return FALSE;
}
//检查所在列
for(m=; m<; m++)
temp[m] = ;
for(m=; m<; m++)
if(sudoku[m][j]!=)
{
if(temp[sudoku[m][j]]==)
temp[sudoku[m][j]] = ;
else
return FALSE;
}
//检查所在九宫格
for(m=; m<; m++)
temp[m] = ;
for(m=; m<; m++)
for(n=; n<; n++)
if(sudoku[i/*+m][j/*+n]!=)
{
if(temp[sudoku[i/*+m][j/*+n]]==)
temp[sudoku[i/*+m][j/*+n]] = ;
else
return FALSE;
}
}
return TRUE;
} int blank_num(int sudoku[][])
{
//计算所给数独中待填入的空白数
int i, j, num = ;
for(i=; i<; i++)
for(j=; j<; j++)
if(sudoku[i][j]==)
num++;
return num;
} Node * mem_alloc(int num_of_empty)
{
Node * node_stack = (Node *)malloc(sizeof(struct node) * num_of_empty);
if(node_stack==NULL)
{
printf("内存分配失败!\n");
exit();
}
return node_stack;
} void trace(int sudoku[][], Node * node_stack, int num_of_empty)
{
int i, j, index, k = ;
//回溯法求解数独
while(num_of_empty)
{
for(i=; i<; i++)
{
for(j=; j<; j++)
{
if(sudoku[i][j]==)
{
(node_stack + k)->col = i;
(node_stack + k)->row = j;
sudoku[i][j] = findvalue(sudoku, node_stack+k);
if(sudoku[i][j]==-)
{
sudoku[i][j] = ;
k--;
while((node_stack + k)->value[]==)
{
//当栈空,说明数独错误,无解
if(k==)
{
printf("此数独无解!\n");
//free(node_stack); //为啥这里一释放内存,就弹出debug assertion failed窗口啊!
exit();
}
sudoku[(node_stack + k)->col][(node_stack + k)->row] = ;
num_of_empty++;
k--;
}
for(index=; index<; index++)
if((node_stack + k)->value[index]==)
{
sudoku[(node_stack + k)->col][(node_stack + k)->row] = index;
(node_stack + k)->value[index] = ;
(node_stack + k)->value[]--;
break;
}
num_of_empty++;
i = (node_stack + k)->col;
j = (node_stack + k)->row;
}
k++;
num_of_empty--;
}
}
}
}
//栈空间使用结束,释放
free(node_stack);
node_stack=NULL;
} int findvalue(int sudoku[][], Node * node)
{
int m, n, i = node->col, j = node->row;
//初始化栈中存储候选值的数组
for(m=; m<; m++)
node->value[m] = ;
for(m=; m<; m++)
{
node->value[sudoku[i][m-]] = ;
node->value[sudoku[m-][j]] = ;
}
for(m=; m<; m++)
for(n=; n<; n++)
node->value[sudoku[i/*+m][j/*+n]] = ; //node->value[0]记录候选值个数,前面的循环可能会修改掉它,需要重新赋0值
node->value[] = ;
for(m=; m<; m++)
if(node->value[m]==) node->value[]++;
for(m=; m<; m++)
if(node->value[m]==)
{
node->value[m] = ;
node->value[]--;
break;
} //返回候选值m,若无候选值可用,返回错误标记-1
if(m==)
return -;
else
return m;
} void print_sudoku(int sudoku[][])
{
//打印数独
int i, j;
for(i=; i<; i++)
{
for(j=; j<; j++)
printf("%2d ", sudoku[i][j]);
printf("\n");
}
}

c语言解数独的更多相关文章

  1. C语言学习 数独游戏

    摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. C语言学习 数独游戏 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 ...

  2. 用C++实现的解数独(Sudoku)程序

    我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...

  3. Jquery暴力解数独

      var arry= new Array(); var nums= new Array(); var snum; function numchain() { snum=0; for(var i=0; ...

  4. hdu 3111 DLX解数独

    思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...

  5. 【原创】一个基于简单剪枝的DFS解数独程序

    问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empt ...

  6. 使用python解数独

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  7. [leetcode]37. Sudoku Solver 解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  8. java解数独

    先输入要解的数独,采用多维数组来保存其中的值,未填数字的地方,初始化为0,然后采用递归的方法来解数独. 直接上代码: /** * * @author walker * */ public class ...

  9. 解数独(Python)

    0.目录 1.介绍 2.一些通用函数 3.全局变量(宏变量) 4.数独预处理(约束传播) 5.解数独(深度优先搜索+最小代价优先) 6.主函数 7.总代码 1.介绍 数独是一个非常有趣味性的智力游戏, ...

随机推荐

  1. Nginx负载均衡和反向代理设置

    Nginx负载均衡: 格式: upstream 别名 {    #别名一般要有意义,能看出是做什么的 server ip:端口;    #要实现负载的服务器的ip.端口号}  例: upstream ...

  2. CentOS 7.0 安装中文输入法

    这是个蛋疼的问题 1.Applications -- System Tools -- Setting -- Regin & Language 2.input source -- + -- mo ...

  3. android学习笔记26——Activity

    Activity ==> android中四大组件:Activity.Service.BroadcastReceiver.ContentProvider Activity组件用于对用户呈现操作界 ...

  4. 基于session的简易购物车引发的问题

    一.功能描述:  页面如下所示: 运行报错: java.io.FileNotFoundException: E:\apache-tomcat-8.0.37\work\Catalina\localhos ...

  5. activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  6. 【转】T-SQL 教程

    USE [test] GO /****** Object: StoredProcedure [dbo].[PageIndex] Script Date: 12/07/2011 10:26:36 *** ...

  7. wordpress主题结构_源码

    WordPress博客主题的工作机制 WordPress主题由一系列模板文件组成,每个文件分别控制主题的特定区域.无论你处于哪个页面都能看到的网站的静态部分,由header文件.sidebar和foo ...

  8. 6. redis持久化,认证

    一. RDB 快照持久化 (默认) rdb机制,在满足redis.conf中配置的持久化策略后, 自动持久化数据, 默认存储在dump.rdb文件中 策略 : save 900 1 : 900秒内,一 ...

  9. Maven打包web工程成WAR

    其实不一定要通过Goals:package来打war包,直接run as maven bulid也行:

  10. 单实例Singleton

    单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在 整个系统中只能出现一个类的实例.这样做当然是有必然的, ...