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.介绍 数独是一个非常有趣味性的智力游戏, ...
随机推荐
- web几个高性能框架的简单测试
参考的这里 压测工具 wrk -t16 -c100 -d30s http://127.0.0.1:8080/rest/hello 测试代码 package main import ( "st ...
- Dell vsotro 14 3000系列从win10重装win7
1. F2启动进入新的BIOS界面,首先Disable Secure Boot,然后把UEFI改为Legeacy模式,当然是改不回来的,不知道为什么: 2. 插入U盘(老毛桃+UEFI启动镜像): 3 ...
- SecureCRT控制台显示中文字符的设置
- PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
20150701 Created By BaoXinjian
- PLSQL_Oracle物化视图Material View的基本概念和用法 (概念)
2014-06-08 Created By BaoXinjian
- adb 工具学习
adb (android debug bridge)简单介绍: 1.adb 是 Android SDK中所带工具.使用adb,可以在PC上操作Android设备或者模拟器 2.主要功能有: 将本地ap ...
- ci模板布局方式
1.修改Loader链式加载header和footer方式 参考:http://stackoverflow.com/questions/9540576/header-and-footer-in-cod ...
- JAVA实例,求用户输入的整数是否是偶数
题目:用户能输入一个整数,输入后返回是偶数还是奇数. 偶数规则:除以2能整除的数称之为偶数,否则是奇数 实例: switch版 import java.util.Scanner; public cla ...
- Zend Guard Run-time support missing问题的解决
Zend Guard不仅可以实现对PHP应用的脚本进行加密保护和对PHP应用的产品进行商业许可证管理,还可以为许多软件生产商.IT服务提供商提供完善的加密和安全的产品发布系统. 虽然现在可以成功加密p ...
- Linux有问必答:怎样解决“XXX is not in the sudoers file”错误
问题:我想在我的Linux系统上使用sudo来运行一些特权命令,然而当我试图这么做时,我却得到了"[我的用户名] is not in the sudoers file. This incid ...