c语言解数独
来自: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语言解数独的更多相关文章
- C语言学习 数独游戏
摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. C语言学习 数独游戏 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 ...
- 用C++实现的解数独(Sudoku)程序
我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...
- Jquery暴力解数独
var arry= new Array(); var nums= new Array(); var snum; function numchain() { snum=0; for(var i=0; ...
- hdu 3111 DLX解数独
思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...
- 【原创】一个基于简单剪枝的DFS解数独程序
问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empt ...
- 使用python解数独
偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...
- [leetcode]37. Sudoku Solver 解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- java解数独
先输入要解的数独,采用多维数组来保存其中的值,未填数字的地方,初始化为0,然后采用递归的方法来解数独. 直接上代码: /** * * @author walker * */ public class ...
- 解数独(Python)
0.目录 1.介绍 2.一些通用函数 3.全局变量(宏变量) 4.数独预处理(约束传播) 5.解数独(深度优先搜索+最小代价优先) 6.主函数 7.总代码 1.介绍 数独是一个非常有趣味性的智力游戏, ...
随机推荐
- DateGridView中添加下拉框列并实现数据绑定、更改背景色
1.添加下拉框 代码实现==> using System; using System.Collections.Generic; using System.Windows.Forms; names ...
- erlang r19里面的mnesia_ext
r19据说支持了mnesia_ext,终于可以给那个恶心2gb limit的mnesia换存储引擎了 先下载r19源码,编译 ./otp_build all -a ~/dev/erlang/r19 . ...
- 五大Android布局方式浅析
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...
- [platform]linux platform device/driver(二)--Platform Device和Platform_driver注册过程之详细代码
转自:http://www.cnblogs.com/haimeng2010/p/3582403.html 目录: 1.platform_device注册过程 2.platform_driver注册过程 ...
- [CSS]置换和非置换元素
转自:http://blog.doyoe.com 先进一个题外话 在面试一个 重构(各大公司的叫法可能不太一样)时,我喜欢从一个点开始问,然后一直延展下去成为一条线,甚至是一个面,直到问到不会的地方, ...
- OAF_VO系列3 - Binding Style绑定方式
在OAF VO开发中,Binding Style主要用于对VO的where clause做动态传值,总共有三种方式 1. Oracle Named 2. Oracle Posi ...
- MST_kruskal
kruskal是求最小生成树的算法. 首先,kruskal就是把所有边按照权值从小到大的顺序排列,这一步可以直接使用sort,然后依次考查每一条边,设w=(u,v)表示从u到v的一条边的权值为w,则有 ...
- PopuWindow_1
PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作, 但它与Dialog又有很大的区别,PopupWindow只是弹 ...
- 【转】select和epoll模型的差异
http://www.cppblog.com/converse/archive/2008/10/12/63836.html epoll为什么这么快 epoll是多路复用IO(I/O Multiplex ...
- JAVA 想让类无法new,可以使用private将类的构造函数改为私有的,这样new的时候就会报错了
JAVA 想让类无法new,可以使用private将构造函数改为私有的,这样new的时候就会报错了 主要用于,静态工具类,静态类不需要new,直接使用 类名.静态方法 即可调用 class D{ ...