一个简单数独求解的算法
突发奇想,想解决一个数独的求解算法
直接贴代码吧!
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
int n=9;
int total=0;
int arr[9][9]={0};
int stop = 0;
char buff[2014]="";sqlite3 *db;void format_data()
{for(int i=0;i<n;i++){for(int j=0;j<n;j++){arr[i][j]=0;}}
}void save_data(){memset(buff,0,sizeof(buff));for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==0 && j==0)sprintf(buff,"%d",arr[i][j]);elsesprintf(buff,"%s,%d",buff,arr[i][j]);}}std::cout<<"buff:"<<buff<<std::endl;}bool isEnable(int row,int col){for(int i=0;i<n;i++){if((arr[i][col] == arr[row][col]) && (i != row))return false;}for(int j=0;j<n;j++){if((arr[row][j] == arr[row][col]) && (j != col))return false;}int x=row/3;int y=col/3;x = x*3;y = y*3;for(int i=x;i<x+3;i++){for(int j=y;j<y+3;j++){if((arr[i][j] == arr[row][col]) && (i!=row) &&(j!=col))return false;}}return true;
}void print(){for(int i=0;i<n;i++){for(int j=0;j<n;j++){std::cout<<arr[i][j]<<" ";}std::cout<<std::endl;}
}void queen(int row,int num){if(stop == 1)return ;if(num >= 9 && row == n){stop = 1;total++;//std::cout<<"第"<<total<<"种解法:"<<std::endl;//print();save_data();return ;}if(row == n){queen(0,num+1);return ;}for(int col=0;col<n;col++){if(arr[row][col] == 0 || arr[row][col] == num ) {int flag = 0;if(arr[row][col] == num)flag = 1;arr[row][col]=num ;if(isEnable(row,col))queen(row+1,num);if(flag != 1)arr[row][col]=0;}}
}void rand_arr(int num){sleep(1);format_data();srand(time(NULL));int count = 0;int value = random() % 10;arr[0][0] = value;while(count < num){int n = random() % 82;int value = random() % 10;//std::cout<<"n = "<<n<<" ";int row = n/9;int col = n%9;if(arr[row][col] == 0){if(value <= 0)continue;arr[row][col] = value;if(isEnable(row,col))count++;elsearr[row][col] = 0;}}std::cout<<std::endl;//print();//std::cout<<std::endl;
}int main()
{char *zErrMsg = 0;char sql[1024]; //存放sqlite执行命令int rc;int len = 0;memset(buff,0,sizeof(buff));rc = sqlite3_open("sudo.db",&db); //打开数据库if(rc != SQLITE_OK){printf("zErrMsg = %s\n",zErrMsg);return -1;}memset(sql,'\0',sizeof(sql));strcpy(sql,"create table sudo(id integer PRIMARY KEY AUTOINCREMENT,value varchar(256));");//创建表sqlite3_exec(db,sql,0,0,&zErrMsg); //执行sqlite命令语句int cnt=0;while(cnt<100000){stop = 0;total = 0;rand_arr(20);queen(0,1);std::cout<<"total="<<total<<std::endl;if(total <=0)continue;memset(sql,'\0',sizeof(sql));sprintf(sql,"insert into sudo(value) values('%s');",buff); //插入数据rc = sqlite3_exec(db,sql,0,0,&zErrMsg);if(rc != SQLITE_OK){printf("zErrMsg = %s\n",zErrMsg);return -1;}cnt++;}int nrow = 0,ncolnum = 0;char **azResult; //存放查询结果sqlite3_free(zErrMsg);sqlite3_close(db); //关闭数据库return 0;
}
这是用深度优先查找算法解决的,从八皇后问题延伸到数独求解。
欢迎各位留言讨论.
一个简单数独求解的算法相关推荐
- java自动红包_Java一个简单的红包生成算法
一个简单的红包生成算法,代码如下: /** * 红包 * @param n * @param money 单位:分 * @return **/ public static double[] redPa ...
- 用C语言实现一个简单的一元线性回归算法
今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...
- 用计算机画魔方的一个面,计算机求解魔方算法.pdf
计算机求解魔方算法.pdf 第 1l卷第3期 计算技术与 自动化 VoI.11 N0.3 199Z年9月 COM PUTNG TECHNOLOGY AND AUToMATl0N Sept. 199Z ...
- 『开源』一个简单的 字符串计算 算法开源
算法开发原因: 自己一直在 配置化编程 方面努力,希望 项目复杂的功能可以用 简单的 配置来完成: 于是 在自己的网站中,使用了一个自己写的 数据库框架,为了给框架提速,于是就 想将 少于 5000 ...
- 微信抢红包代码 python_用 Python 实现一个简单的微信红包算法
今年过年各位一定在微信里抢了不少红包.那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写? 这里我给一个简单的实现方案. 基本思路就是,有多少个红包,就循环多 ...
- 一个简单的多机器人编队算法实现--PID
由于一些资源链接失效,如下文档还可以使用: https://download.csdn.net/download/zhangrelay/9514411 用PID进行领航跟随法机器人编队控制 课题2:多 ...
- 简单的加密/解密算法_/c++
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36557960/article/details/79299093 关于加密和解密问题,有的加密 ...
- 数独求解算法_我如何回到一个老问题,终于写了一个数独求解算法
数独求解算法 by Ali Spittel 通过Ali Spittel 我如何回到一个老问题,终于写了一个数独求解算法 (How I came back to an old problem and f ...
- 数独求解算法效率对比结果
在网上或是科技论文文献中,总是看到有人说自己的数独求解算法多牛,有时我为了验证他的算法有多牛,还把他的代码拷下来在自己的电脑上试一下,但结果还是让我比较失望的,如果你想知道你的算法有多牛,那就跑一下这 ...
最新文章
- 中科大计算机复试题目,中科大计算机复试笔试部分 09-15
- Guava学习笔记:Preconditions优雅的检验参数
- Linux下制作动图的软件,Linux 下制作Gif动画
- mysql 字符串的处理
- flutter 应用场景_【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景...
- 如何解决每次打开office 都会出现正在配置的问题
- python与tensorflow知识点截图集锦(持续囤积)
- ×××送通知服务教程 Apple Push Notification Services Tutorial
- ubuntu命令查询版本和内核版本
- Python变量的作用范围
- ansible的delegate_to、connection、和local_action
- WCF系列之什么是WCF
- Fences隐藏桌面图标快捷方式箭头
- 《Qt 实战一二三》
- 数字人枫灵Lynn,获得江苏省文化产业周刊关注!
- python能用于unix吗_用Python实现低配的Unix Cron,一个能让程序在计划的时间运行的系统...
- 凝思系统机器名怎么查看_凝思操作系统Custom Linx安装教程
- diag矩阵(Diag矩阵计算公式)
- c语言macro pdf,C语言的宏macro的使用
- 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
热门文章
- 【Windows系统】win10系统假死,窗口不能动,鼠标能动或不能动,最后蓝屏显示错误码: VIDEO_DXGKRNL_FATAL_ERROR 的解决办法
- 用Tkinter打造自己的Python IDE开发工具(5)利用HP_tka模块设计自己的中文代码编辑器
- 有什么好技巧可以恢复电脑回收站丢失的文件呢
- 卷积神经网络手势识别之剪刀石头布
- Delphi类型区分——常数
- 简单安全的u盘杀毒软件
- windows下制作Ubuntu的U盘启动工具
- 通达OA未授权任意文件上传及文件包含漏洞分析学习
- linux删除用户出现user xxx is currently used by process xxx的解决方案
- SEO优化技术 - K站恢复快照收录排名