突发奇想,想解决一个数独的求解算法
直接贴代码吧!
#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]);
else
sprintf(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++;
else
arr[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;
}
这是用深度优先查找算法解决的,从八皇后问题延伸到数独求解。
欢迎各位留言讨论.