序言
你好!这里是我的又一篇博客。事情的起因是前几天突然想到了大学玩的数独问题,然后想着怎么用程序解决。于是,新的故事展开了。
故事的开始
如果我还是大学时的菜鸟程序员,我会马上打开电脑创建程序。但是这次我,首先考虑了编程语言。
因为我深入考虑后,解数独问题需要先用给的数字,加上给的1-9每个数字在每一行、每一列和每一宫中都只出现一次的条件参考百度百科,在空格位置备注可能的值,然后从可能数目最少的。当然,如果只有一个那就最开心了。然后一遍遍地利用条件筛选,然后更新可能值,直到最后所有格子都确定下。
编程上的选择
上面说了我的解决想法,下面说一下我是怎么考虑编程语言,以及其它。这不是按照时间顺序写的,其实我先想好的这个部分。
我当时想,数独问题最简单的是暴力地尝试了,机器学习的办法也许也可以,但是我不会。继续说暴力尝试,9*9的数独可能的解法。我指的是求解答案的过程,其实数独的答案也不一定是唯一的,具体可以看一个答案不唯一的数独问题。
然后我想计算机内部用的是二进制运算的,那编写的程序如果大量使用到二进制,不就能尽可能地发挥出计算机的计算能力了。然后就是编程语言,我选择C。后面编程执行的时候还有一个小小的插曲。
过程
过程上我是想自己思考,编程的,但是我对位运算了解的太少了。再加上对算法的思考,可能会让我花费很多的时间。幸好,前人栽树,而且更好的是,我的思考完全和代码符合,而且,结果也如我所想,对一般的数独,不用一秒就能解决,稍微难点的,也是一秒左右。后面我会把代码还有输入的数据以及我做的结果都展示出来。
C代码
#include <stdio.h>
#include <stdlib.h>
#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++)