程序解决数独问题

程序解决数独问题

    • 序言
    • 故事的开始
    • 编程上的选择
    • 过程
    • C代码
    • 我的实验
    • 最后

序言

你好!这里是我的又一篇博客。事情的起因是前几天突然想到了大学玩的数独问题,然后想着怎么用程序解决。于是,新的故事展开了。

故事的开始

如果我还是大学时的菜鸟程序员,我会马上打开电脑创建程序。但是这次我,首先考虑了编程语言。
因为我深入考虑后,解数独问题需要先用给的数字,加上给的1-9每个数字在每一行、每一列和每一宫中都只出现一次的条件参考百度百科,在空格位置备注可能的值,然后从可能数目最少的。当然,如果只有一个那就最开心了。然后一遍遍地利用条件筛选,然后更新可能值,直到最后所有格子都确定下。

编程上的选择

上面说了我的解决想法,下面说一下我是怎么考虑编程语言,以及其它。这不是按照时间顺序写的,其实我先想好的这个部分。
我当时想,数独问题最简单的是暴力地尝试了,机器学习的办法也许也可以,但是我不会。继续说暴力尝试,9*9的数独可能的解法。我指的是求解答案的过程,其实数独的答案也不一定是唯一的,具体可以看一个答案不唯一的数独问题。
然后我想计算机内部用的是二进制运算的,那编写的程序如果大量使用到二进制,不就能尽可能地发挥出计算机的计算能力了。然后就是编程语言,我选择C。后面编程执行的时候还有一个小小的插曲。

过程

过程上我是想自己思考,编程的,但是我对位运算了解的太少了。再加上对算法的思考,可能会让我花费很多的时间。幸好,前人栽树,而且更好的是,我的思考完全和代码符合,而且,结果也如我所想,对一般的数独,不用一秒就能解决,稍微难点的,也是一秒左右。后面我会把代码还有输入的数据以及我做的结果都展示出来。

C代码

#include 
#include 

#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)

struct{
   
    int left;
    char num;
    char g;
}board[SIZE][SIZE];

int bit2num(int bit)
{
   
    switch(bit){
   
        case 1:case 2:
            return bit;
        case 4:
            return 3;
        case 8:
            return 4;
        case 16:
            return 5;
        case 32:
            return 6;
        case 64:
            return 7;
        case 128:
            return 8;
        case 256:
            return 9;
    }
}

void printf_res()
{
   
    int i, j, k;

    for(i=0; i<SIZE; i

你可能感兴趣的:(程序解决数独问题)