当前位置: 首页 > news >正文

AcWing 166.数独

这道题一看起来就很麻烦,但是可以用bitset进行优化

暴力搜索就是了

代码如下:

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;

const int maxn = 10;
bitset<maxn> r[maxn], c[maxn], b[maxn];
int N, G[maxn][maxn];

inline void init(void){
    memset(G, 0, sizeof(G));
    N = 0;
    for(int i = 0; i < maxn; i++){
        r[i].set(); c[i].set(); b[i].set();
    }
}
bool dfs(int n){
    if(n == N) return true;
    //寻找最少的
    int minv = 10, id = 100;
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
            if(G[i][j] == 0){
                int num = (r[i] & c[j] & b[(j / 3) + (i / 3) * 3]).count();
                if(num == 0) return false;
                if(num < minv){minv = num; id = i * 9 + j;}
            }
    int rr = id / 9, cc = id % 9; bitset<maxn> x = r[rr] & c[cc] & b[(cc / 3) + (rr/ 3) * 3];
    for(int i = 1; i <= 9; i++){
        if(x.test(i)){
            r[rr].reset(i); c[cc].reset(i); b[(cc / 3) + (rr/ 3) * 3].reset(i); G[rr][cc] = i;
            if(dfs(n + 1)) return true;
            r[rr].set(i); c[cc].set(i); b[(cc / 3) + (rr/ 3) * 3].set(i); G[rr][cc] = 0;
        }
    }
    return false;
}
inline void output(void){
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++){
            printf("%d", G[i][j]);
        }
    putchar('\n');
}

int main(void)
{
    char _c;
    while(true){
        if((_c = getchar()) =='e') break;
        init();
        for(int i = 0; i < 81; i++){
            if(_c != '.'){
                int rr = i / 9, cc = i % 9;
                r[rr].reset(_c - '0'); c[cc].reset(_c - '0');
                b[(cc / 3) + (rr/ 3) * 3].reset(_c - '0');
                G[rr][cc] = _c - '0';
            }
            else N++;
            _c = getchar();
        }
        dfs(0);
        output();
    }

    return 0;
}

其中,对于在某一个位置填入数的时候r,c,b的变化可以写在函数里,使程序更加规整

而r[i]代表第i行,能填入的数是哪些,如果能填入则相应的二进制位为1

c代表行的,b代表块的

相关文章:

  • C++基础精讲-04
  • 对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性
  • <C#>在 C# .NET 6 中,使用IWebHostEnvironment获取Web应用程序的运行信息。
  • 谷歌闭源Android后的生态变局与数据库国产替代的必要性——以金仓数据库为例
  • 出口商品贸易方式企业性质总值数据库
  • ReentrantLock 实现公平锁和非公平锁的原理!
  • swift菜鸟教程6-10(运算符,条件,循环,字符串,字符)
  • 2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果
  • 深入剖析观察者模式:原理、实践与 Spring 源码解读
  • 深度学习总结(8)
  • CSS高级技巧
  • 使用治疗前MR图像预测脑膜瘤Ki-67的多模态深度学习模型
  • 【Qt】QxOrm:下载、安装、使用
  • 界面控件DevExpress WinForms v25.1新功能预览 - 聚焦用户体验升级
  • 如何应对“最后时刻任务堆积”(鼓包现象)
  • 《Vue Router实战教程》5.嵌套路由
  • 二叉树的应用
  • Dubbo、HTTP、RMI之间的区别
  • 递归?递推?
  • Asp.NET Core WebApi 创建带鉴权机制的Api
  • 兖州网站建设/湖州网站seo
  • 免费网站建设itcask/网站如何提升seo排名
  • 1号网站建设 高端网站建设/怎么做网站排名
  • 东港建站公司/百度一下官网网址
  • 太原网站建设 网站制作/凡科建站和华为云哪个好
  • 网站做任务赚qb/网络推广的概念