数独(二进制优化)

该博客介绍了一种使用二进制优化的方法来解决数独问题。通过9位二进制串表示行、列和3x3宫格中数字的使用状态,将9x9的数独转化为3x3的处理,简化了问题。在初始化时,将3个值设置为全1。为了提高效率,采用剪枝策略,优先填充那些在当前3x3宫格、行和列中剩余空位较少的位置。利用lowbit计算填数时所需的修改,以提高算法性能。
摘要由CSDN通过智能技术生成

在这里插入图片描述

思路:暴力数独就是判断行列和3X3的方格内没有重复的数就填一个,这样暴力搜,我们可以发现可用通过一个9位的二进制串表示行列或者3x3的方格内的数有没有用过,比如row[0]=111111111,就表示第1行中1,2,3…,9都没用过,列也相同,3x3的方格表示的特殊一点,原来是9X9的方格,现在我们只需要用个2进制串就能表示一个3X3的方格中的数有没有用过那么我们就可以吧原来的缩成9X9的缩小成3X3的用下标进行映射对应块,所以初始化我们吧这个3个的值都置为全1(1<<9)-1,我们发现在原图中每个点所在3X3的格子和行列中需要填的空越少的越好填,那么就加一个剪枝,我们先找容易填的地方,这里我们就需要记录行列和小方块&操作之后1的个数,我们用lowbit求一下就行,因为填数时,需要改名row,col,cell的值需要lowbit操作顺便就用了

看不懂也没关系毕竟我比较菜

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
#define SIS std::ios::sync_with_stdio(false)
#define space putchar(' ')
#define enter putchar('\n')
#define lson root<<1
#define rson root<<1|1
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int mod=1e9+7;
const int N=2e5+5;
const int inf=0x7f7f7f7f;

int gcd(int a,int b)
{
   
    return b==0?a:gcd(b,a%b);
}
 
ll lcm(ll a,ll b)
{
   
    return a*(b/gcd(a,b));
}
 
template <class T>
void read(T &x)
{
   
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-')
            op = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值