程序解决数独问题

序言

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

故事的开始

如果我还是大学时的菜鸟程序员,我会马上打开电脑创建程序。但是这次我,首先考虑了编程语言。
因为我深入考虑后,解数独问题需要先用给的数字,加上给的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++)
    
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值