一个简单数独求解的算法

突发奇想,想解决一个数独的求解算法

直接贴代码吧!

#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;
}

这是用深度优先查找算法解决的,从八皇后问题延伸到数独求解。

欢迎各位留言讨论.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值