数独(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搜索

解数独程序源码

Verilog语法之十:过程块(initial和always)

我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。

航天领域资深码农,型号经验丰富,一线干货分享 1671

基于DFS实现数独游戏解法

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

weixin_44001521的博客 417

运算放大器噪声分析实战:从理论到TINA-TI仿真的完整指南

本文深入探讨运算放大器噪声分析的完整流程,从基础理论到TINA-TI仿真实践。详细解析噪声来源、运放噪声模型建立、手工计算方法,并结合TI工具进行高效仿真验证,提供低噪声电路设计优化策略,帮助工程师提升精密电子系统性能。

Jerry的专栏 947

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

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

代码改变世界 1044

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1759

别让你的URDF模型在Gazebo里‘躺平’:手把手教你配置libgazebo_ros_diff_drive插件让两轮小车动起来

本文详细解析了如何在Gazebo中配置libgazebo_ros_diff_drive插件,使两轮小车模型实现动态仿真。从URDF模型到传动装置,再到差速驱动插件的精细调参,手把手教你解决机器人‘躺平’问题,提升ROS1与Gazebo仿真的实战能力。

weixin_42552716的博客 333

dfs+剪枝 数独

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

A_Pathfinder的博客 580

(RegionProposal Network)RPN网络结构及详解

RPN(RegionProposal Network)区域生成网络 Faster-RCNN的核心。在这里整理。 1.anchors。 特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{128,256,512}×{128,256,512}×三种比例{1:1,1:2,2:1}{1:1,1:2,2:1}。这些候选窗口称为anchors...

凹酱的DEEP LEARNING 19万+

166 数独(dfs之剪枝)

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

二哈 1307

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7280

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5621

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

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

晚安( ̄o ̄) . z Z 697

71.qt quick-可伸展菜单-抽屉栏示例 通用QML界面(一键换肤)

特点: 支持动态添加item、删除item、自适应界面 附带添加删除、展开等动画 同时支持qwidget、qml加载 支持number提示(比如消息数量等) 侧边抽屉栏支持动画伸展 支持换肤、拖拽、最大化等

抵抗时间扭曲,坚持做一件有意义的事 5285

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

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

weixin_30511039的博客 156

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

T_Y_F_的博客 422

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

卜及中的博客 1029

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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、付费专栏及课程。

余额充值