数独(dfs+剪枝)

数独【DFS】 题目描述 数独是一种传统益智游戏,你需要把一个\red{9 × 9}9×9的数独补充完整,使得图中每行、每列、每个\red{3 × 3}3×3的九宫格内数字\red{1 ~ 9}1~9均恰好出现一次。 请编写一个程序填写数独。 输入格式 输入包含多组测试用例。 每个测试用例占一行,包含\red{81}81个字符,代表数独的\red{81}81个格内数据(顺序总体由上到下,同行由左到右)。 每个字符都是一个数字\red{ 1 ~ 9 }1~9或一个”.”(表示尚未填充)。 您可以假设输入中的 阅读详情

题目:数独

参考:yxc
题意:就是给你一个九宫格,让你填数,使横行包含1 ~ 9,纵行包含1 ~ 9,每一块包含1 ~ 9 。
思路:本题采用深搜,然后通过用col和row分别记录横行和纵行没有被用过的数,cell来标记没有被用过的数,通过0代表这个数已经被用过了,1代表这个数没有被用过,然后通过剪枝找到某个数可以填数的最小可能,这个最小可能通过row[x] & cell[x/3][y/3] & col[y]来找到。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
const int N = 9;
char str[maxn];
int cell[10][10],row[maxn],col[maxn];
int mp[1<<N], ones[1<<N];
int lowbit(int x)
{
    return x&(-x);
}
void set_init()
{
    for(int i = 0; i < N; i++ )mp[1<<i] = i;
    for(int i = 0; i < 1<<N; i++)
    {
        int cn = 0;
        for(int j = i; j; j -= lowbit(j))cn++;
        ones[i] = cn;
    }
}
void init()
{
    for(int i = 0; i < N; i++)row[i] = (1<<N)-1, col[i] = (1<<N)-1;
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            cell[i][j] = (1<<N)-1;
}
int judge(int x, int y)
{
    return row[x] & cell[x/3][y/3] & col[y];
}
bool dfs(int cnt)
{
    if(!cnt)return true;
    int minn = 10, x, y;
    for(int i = 0; i < N; i++)//找到最小的能填数的位置
    {
        for(int j = 0; j < N; j++)
        {
            if(str[i*N+j] == '.')
            {
                int t = ones[judge(i, j)];
                if(minn > t)minn = t, x = i, y = j;
            }
        }
    }
    for(int i = judge(x, y); i; i -= lowbit(i))
    {
        int t = mp[lowbit(i)];
        row[x] -= 1<<t;
        col[y] -= 1<<t;
        cell[x/3][y/3] -= 1<<t;
        str[x*N+y] = '1'+ t;
        if(dfs(cnt-1))return true;
        row[x] += 1<<t;//恢复现场
        col[y] += 1<< t;
        cell[x/3][y/3] += 1<<t;
        str[x*N+y] = '.';
    }
    return false;
}
int main()
{
    set_init();//预处理
    while(cin>>str && strcmp(str, "end") != 0)
    {
        init();//初始化为全1
        int cnt = 0;
        for(int i = 0, k = 0; i < N; i++)
        {
            for(int j = 0; j < N; j++, k++)
            {
                if(str[k] != '.')
                {
                    int t = str[k] - '1';
                    row[i] -= 1<<t;
                    col[j] -= 1<<t;
                    cell[i/3][j/3] -= 1<<t;
                }
                else cnt++;
            }
        }
        dfs(cnt);
        printf("%s\n", str);
    }
    return 0;
}
【DFS】解数独 只要满足这个元素在这一行这一列以及对应的3x3的小矩阵没有出现即可,可以使用哈希将这个列这个行跟3x3的矩阵以及存在的元素存储到哈希表中,然后看对应的哈希表中是否存在该元素即可,对于每一列每一行只需要维护一个数字即可,如果这一行有8,就将这行对应的数的第8个二进制位置修改为1,如果有7同理将这个数的第7个二进制改为1。枚举每一个空位存在的所以可能,在枚举过程中进行合法性判断(如果该空位选择1,则判断这一列,这一行对应的3x3的格子是否已经存在了这个元素,如果存在就返回). - 力扣(LeetCode) 阅读详情

相关推荐

靶形数独(dfs+剪枝)

题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格 高的小九宫格(用粗黑色线隔开的)。在这

Loi_feather的博客 1044

DFS算法解决数独问题

DFS算法解决数独问题 一,情景描述   一天晚自习,看到女朋友在旁边玩数独,便想着不如用个算法帮助她快速通关。毕竟,我想以后能成为一个AI算法工程师,所以现在不管是什么算法,多写点总归是有好处的。   对于这个程序的功能,我希望它能够从文件夹里读取棋盘,然后运行之后输出完整的棋盘。这样对于不同的棋盘,只要更改一下文件路径,就能输出结果。其实,我想着利用计算机视觉就可以直接输入图片,然后电脑自己处理自己输出。但是奈何大二的自己还对计算机视觉一无所知,就只能手动输入到文本文件中了。 二,最初思路   最开始,

Santer的博客 2157

python数独代码(DFS,包含剪枝操作)

class Solution: def solveSudoku(self, board): tmpList = self.todoList(board) self.dfs(tmpList, board, 0) def dfs(self, tmpList,board, k): # 确认完成操作 if k==len(tm...

okgagaga的博客 1555

DFS解数独问题

DFS解决数独问题

m0_71009069的博客 362

解数独 数独游戏 DFS搜索

解数独程序源码

告别裸机思维:在STM32F407上玩转LwIP,让你的设备轻松接入TCP网络

本文详细介绍了如何在STM32F407微控制器上使用LwIP协议栈实现TCP网络连接,从裸机编程到网络化的架构革命。通过事件驱动模型、内存优化配置和工业级稳定性实现,帮助开发者高效构建稳定TCP连接,适用于物联网设备联网等场景。

weixin_33725515的博客 562

基于DFS实现数独游戏解法

起因,在csdn的问答区,看到有个待回答的问题,题目“c语言数独程序缺少函数”,但是截止我发文,还没有人回答,我想分享下我的想法。

weixin_44001521的博客 417

告别CAPL编程!用Matlab/Simulink+CANoe实现复杂ECU仿真的5个技巧

本文介绍了如何利用Matlab/Simulink与CANoe进行联合仿真,以替代复杂的CAPL编程,高效实现复杂ECU仿真。文章分享了5个核心技巧,涵盖信号映射、模型编译集成、实时参数调整、性能优化及数据分析,帮助算法工程师构建稳定强大的仿真环境,显著提升开发与测试效率。

rgv234567的博客 296

搜索技术【深度优先搜索】 - DFS+ 剪枝优化 【POJ No. 2676】数独游戏 Sudoku

搜索技术【深度优先搜索】 - DFS+ 剪枝优化 【POJ No. 2676】数独游戏 Sudoku

代码改变世界 1044

baostock实战:如何用Python批量下载多只股票的历史数据(含常见错误排查)

本文详细介绍了如何使用Python和baostock库批量下载多只股票的历史数据。内容涵盖从环境搭建、代码标准化到构建稳健的批量下载框架的全过程,并重点提供了高级错误处理、网络重试、数据验证及内存管理等实战解决方案,帮助用户高效构建股票数据处理流水线。

nice1的博客 1081

宇树机器狗go2—slam建图(1)点云格式

上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。

古月居 3270

dfs+剪枝 数独

题:(题目来源2018蓝桥模拟一) 蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案? 标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。 输出这...

A_Pathfinder的博客 580

iPad秒变Mac副屏的隐藏技巧:用BetterDisplay实现无线竖屏+90度锁定

本文详细介绍了如何利用BetterDisplay软件突破苹果原生“随航”(Sidecar)功能的限制,将iPad无线设置为Mac的竖屏副屏,并实现90度方向锁定。通过创建虚拟显示器、配置分辨率与旋转参数,并校准鼠标指针,用户可以高效利用iPad的纵向空间进行文档阅读、编码等工作,显著提升多屏协作效率。

weixin_29266647的博客 603

166 数独(dfs之剪枝)

1. 问题描述: 数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行、每列、每个 3×3 的九宫格内数字 1∼9 均恰好出现一次。请编写一个程序填写数独。 输入格式 输入包含多组测试用例。每个测试用例占一行,包含 81 个字符,代表数独的 81 个格内数据(顺序总体由上到下,同行由左到右)。每个字符都是一个数字(1−9)或一个 .(表示尚未填充)。您可以假设输入中的每个谜题都只有一个解决方案。文件结尾处为包含单词 end 的单行,表示输入结束。 输出格式 每个测试用例,输出

二哈 1307

美团外卖mtgsig 1.2逆向工程:从补环境到签名生成全解析

本文深入解析了美团外卖mtgsig 1.2签名算法的逆向工程全流程。从环境检测原理与补环境实战入手,详细拆解了签名JSON中每个关键字段的生成逻辑,并重点剖析了核心签名a2的生成步骤,涉及设备指纹、MD5、AES加密等关键技术。最后提供了构建签名生成器的实践思路与常见坑点,为理解复杂风控体系提供了完整的技术视角。

weixin_29324401的博客 1752

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3088

2647 数独 easy ver.(dfs,剪枝)

数独游戏规则如下:在9 * 9的盘面上有些已知的数字及未知的数字,推理出所有未知的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 有些局面存在多个解或无解,这属于不标准的数独。对于不标准的局面,输出No Solution。 输入 第1 - 9行,每行9个数中间用空格分隔,0表示该格子的数未知。 输出 如果局面是不标准的,输出No Solution,否则数据具体的解。 输入样...

晚安( ̄o ̄) . z Z 697

uniapp - 详解使用高德地图在地图上实现绘制边界/点聚合/行政区域高亮等功能,Uniapp高德地图点聚合标记及绘制点线面示例代码(全端兼容H5网页、小程序、安卓app、苹果app、nvue)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,高德地图,uniAPP高德地图实现点聚合,地图区域描边、点标记、点信息详情弹窗,实现绘制边界区域,uniapp H5使用高德地图实现点聚合、行政区域高亮,实现高德地图的marker聚合功能,高德地图进行marker标点,点信息展示,点击标记点弹出对话框,点击聚合点后显示信息模态框,打标点,【Uniapp】高德地图的接入自定义标点与信息窗体使用,绘制行政区域边界,绘制多边形,电子围栏,高德行政区划边界,

✅ 精选推荐文章 1万+

洛谷P1074 靶形数独【dfs】【剪枝】

题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下。一个数独的总分数就是权值乘所填数字之和。 现在给一个未完成的数独,问分数最高的数独的总分。 思路: 感觉dfs就是要学会各种剪枝。要敢于剪枝。 最基本的思路就是记下要填的位置和每行每列每个方块填数的情况,然后每个空格都1~9试过来。填完了计算分数。 但是如果仅仅是...

weixin_30511039的博客 156

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

DFS之剪枝与优化AcWing 166. 数独

DFS之剪枝与优化AcWing 166. 数独

T_Y_F_的博客 422

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【算法】递归、回溯、剪枝、dfs 算法题练习(N皇后、单词搜索、数独问题;C++)

DFS(深度优先搜索)是一种图遍历方法,通过尽可能深地访问图中的节点,然后回溯。可用于树的遍历、图的连通性检查等问题。递归:算法的一种方法,通过函数自身调用来解决问题。通常用于解决具有重复子问题的情况,如树形结构或分治策略。回溯:一种递归的策略,用于遍历所有可能的解。通过在探索每一步时进行“尝试”和“撤销”操作来找到问题的所有解。常用于解决排列组合问题。剪枝:优化算法的一种技术,通过提前终止不必要的计算或分支,以减少运算量。常用于回溯算法中,通过检测并排除不符合条件的解。一般对于这种题,可以。

卜及中的博客 1029

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

AcWing 166. 数独 题解(搜索—DFS的剪枝)

AcWing 166. 数独 DFS剪枝,这里的剪枝操作是考虑优先考虑的需要填的数最少的格子,这样就能快速将所有格子填满,因为答案唯一,所以可行

qiaodxs的博客 182

【DFS】【剪枝】数独(简单版)

题目链接: https://www.acwing.com/problem/content/168/ 搜索以及剪枝策略: 搜索顺序优化: 首先搜索可填最少数量数字的格子 二进制优化:用两个数组row[], col[]存储每一行和每一列的可以填的数的状态,一共9位二进制,该位为1时代表可以选,为0时代表不可以选。 lowbit优化:取每一位可以选的数时采用的操作 代码解释: mn:就是单元格中求 最小的可以填的个数 ones[i]:i二进制中1的个数 dfs(cnt):代表从可以填cnt个数开始搜索 #

行码棋 1371

DFS剪枝优化 小猫爬山 数独

DFS剪枝优化 AcWing 165 166 小猫爬山 数独 详细注释

u014285914的博客 902

数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)

知道是数独问题后犹豫了一下要不要做(好像很难的样纸==。),用dfs并剪枝,是一道挺规范的搜索题。 先介绍以下数独吧~ 数独(Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格 的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目...

dianche1354的博客 219

【搜索】DFS剪枝与优化

算法提高课笔记。

Texcavator的博客 802
上一篇: Minimal string(贪心)
下一篇: Nothing for nothing ( 八 )
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值