来自: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. Python Paramiko模块

    代码来自:http://www.cnblogs.com/wupeiqi/articles/4356675.html 今天学到了一个运维方面的利器:python的paramiko模块. paramiko ...

  2. Python 创建函数和代码重用

    1. cat func.py #!/usr/bin/python def func(): print "hello,this is a function" def func2(): ...

  3. Tomcat服务器搭建

    一.JDK环境搭建 二.tomcat下载安装 三.tomcat服务启动 cmd> net start  tomcat8 四.查看tomcat服务器启动情况: http://localhost:8 ...

  4. "XX cannot be resolved to a type "eclipse报错及解决说明

    转自:http://zhaoningbo.iteye.com/blog/1137215 引言: eclipse新导入的项目经常可以看到“XX cannot be resolved to a type” ...

  5. spark MapOutputTrackerMaster

    最近用了一个RowNumber() over()函数 进行三张4000万数据的关联筛选,建表语句如下: create table CiCustomerPortrait2 as SELECT ROW_N ...

  6. DBA_Oracle Erp加密和解密账户密码(案例)

    2014-09-09 Created By BaoXinjian

  7. python(17) 获取acfun弹幕,评论和视频信息

    每天一点linux命令:新建文件夹

  8. JAVA 数组实例-求学生平均成绩,与计算数组的长度

    实例: 知识点:数组名.length是计算数组的长度 import java.util.*; //求学生平均分成绩 public class Test{ public static void main ...

  9. gridview转成EXCEL文件保存(多页)

    CompositeLink complink = new CompositeLink(new PrintingSystem()); PrintableComponentLink link = new ...

  10. 使用Topshelf 5步创建Windows 服务 z

    使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...