leetcode 困难 —— 解数独(简单递归)
创始人
2025-05-28 10:10:09
0

(有点类似于 N 皇后,就是通过递归找可能的解法)

题目:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

题解:
保存三个状态数组
flag1:每一行,已经选取的数
flag2:每一列,已经选取的数
flag3:每 3 * 3 的块,已经选取的数

可以通过状态压缩来保存状态(已经选取的数)
例,二进制 110010,即选了数组1,4,5

依次考虑每一个空白格的可能填入的数字
如果在对应的 行,列,块 中都没有选过对应的数字
则选取对应的数字,进行递归,判断下一个空白格

直到为所有的空白格找到填法

(官方题解里有一个优化思路是,先判断空白格取值只有一种的,相当于将可以确定的空白格先全部填入对应的数)

代码如下

class Solution {
public:int flag[9][9] = { 0 };int flag1[9] = { 0 };int flag2[9] = { 0 };int flag3[3][3] = { 0 };int res[9][9];bool solve(int f, int flag[9][9], int flag1[9], int flag2[9], int flag3[3][3]) {if(f == 81) {for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {res[i][j] = flag[i][j] + '0';}}return true;}int ff = f + 1;while(ff < 81 && flag[ff / 9][ff % 9] != 0) ff++;int fflag[9][9];int fflag1[9];int fflag2[9];int fflag3[3][3];for(int i = 0; i < 9; i++) {fflag1[i] = flag1[i];fflag2[i] = flag2[i];fflag3[i / 3][i % 3] = flag3[i / 3][i % 3];for(int j = 0; j < 9; j++) {fflag[i][j] = flag[i][j];}}for(int i = 1; i <= 9; i++) {if(!((flag1[f / 9] >> i) & 1) && !((flag2[f % 9] >> i) & 1) && !((flag3[(f / 9) / 3][(f % 9) / 3] >> i) & 1)) {fflag[f / 9][f % 9] = i;fflag1[f / 9] += (1 << i);fflag2[f % 9] += (1 << i);fflag3[(f / 9) / 3][(f % 9) / 3] += (1 << i);if(solve(ff, fflag, fflag1, fflag2, fflag3)) {return true;}fflag[f / 9][f % 9] = 0;fflag1[f / 9] -= (1 << i);fflag2[f % 9] -= (1 << i);fflag3[(f / 9) / 3][(f % 9) / 3] -= (1 << i);}}return false;}void solveSudoku(vector>& board) {for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {if(board[i][j] == '.') flag[i][j] = 0;else {flag[i][j] = board[i][j] - '0';flag1[i] += (1 << flag[i][j]);flag2[j] += (1 << flag[i][j]);flag3[i / 3][j / 3] += (1 << flag[i][j]);}   }}int f = 0;while(f < 81 && flag[f / 9][f % 9] != 0) f++;solve(f, flag, flag1, flag2, flag3);for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {board[i][j] = res[i][j];}}}
};

相关内容

热门资讯

黄金“不灵了”,高端金饰的溢价... 古法黄金到底能不能走出脱离金价波动的独立溢价 作者:赵心怡 2026年开年,国际金价一路狂飙至近56...
朗迅科技由董事长徐振控制46%... 瑞财经 刘治颖 6月24日,杭州朗迅科技股份有限公司(以下简称:朗迅科技)深主板IPO获受理,保荐机...
两部门:2030年可再生能源制... 【两部门:2030年可再生能源制氢规模达到200万吨】财联社6月25日电,国家发展改革委、国家能源局...
原创 警... 大家好,这里是全球脉冲。 6月16日,日本央行宣布加息25个基点,政策利率上调至1%,创下31年来最...
黄金钻石回收怎么选?上海市场常... 近年来黄金价格持续走高,不少上海市民都有变现家中闲置黄金首饰、投资金条的打算。但市面上回收门店数量众...
专访火山引擎谭待:模型好对Ma... 文 | 邓咏仪 编辑 | 张雨忻 火山引擎总裁谭待 来源:火山引擎 过去三年,火山引擎总裁谭待给团...
女董事长深夜被带走,牵出金融旧... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 大半夜的,一家上市公司董事...
盯盯拍报考港交所上市:出海翻红... 撰稿|贝多 来源|贝多商业&贝多财经 6月22日,盯盯拍(深圳)技术股份有限公司(下称“盯盯拍”)递...
苏州千亿市值上市公司+1! A股“苏州板块”又诞生了一家千亿市值企业。 昨日(6月25日),苏州上市公司永鼎股份股价在昨日涨停的...
芯片股猛拉!600667,一字... 【导读】创业板指一度涨超2%,存储芯片、半导体、电子元器件等方向涨幅居前 中国基金报记者 李智 一起...
分析师:海峡收费与否已不重要 ... 来源:格隆汇APP 格隆汇6月25日|阿曼方面重申,霍尔木兹海峡未来安排不涉及通行费。美国财经网站i...
《内外贸一体化企业评价通则》团... 齐鲁晚报·齐鲁壹点记者 管悦 6月25日,《内外贸一体化企业评价通则》团体标准审查会在济南召开。该标...
提升AI智能体工作流的速度与能... 智能体工作流是一种由AI驱动的软件系统,它通过串联多个模型与外部工具来处理复杂任务,例如分析视频并回...
热搜!又有纸尿裤被曝检出甲酰胺... 来源:市场资讯 (来源:北京商报) 网友:“囤了200多包”。 近日,多个婴幼儿纸尿裤品牌“被检出...
埃森哲内部录音曝光:企业AI使... IT之家 6 月 26 日消息,科技媒体 404Media 昨日(6 月 25 日)发布博文,披露了...
FIBA期待杨瀚森表现 最新实... 北京时间6月25日消息,FIBA国际篮联公布了最新一期世界杯预选赛亚太区球队实力榜,中国男篮排在澳大...
收评:创业板指放量反弹涨2.8... 市场冲高回落后,再度震荡拉升。黄白线分化明显,权重股走势较强。量能明显放大,沪深两市成交额3.59万...
巨头财报引爆A股存储芯片板块,... 当地时间6月24日美股盘后, 美光科技(MU.US)公布截至5月31日的2026财年第三财季财报,业...
银行、消金公司助贷余额增速不得... 近日,中国证券报记者从多位业内人士处独家获悉,5月以来,多地金融监管部门对部分中小银行、消金公司下达...