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];}}}
};

相关内容

热门资讯

文峰股份:股东郑素贞所持全部公... 文峰股份公告,近日,公司收到青岛中院《拍卖通知书(变卖)》,公司持股5%以上股东郑素贞持有的公司12...
美亚科技IPO进行时:票务业务... 广东美亚旅游科技集团股份有限公司(美亚科技)近日向北交所提交了第三轮问询回复,继续推进其IPO进程。...
权威发布丨25条新政出台!我市... 7月29日,烟台市人民政府新闻办公室举行新闻发布会。烟台市住房和城乡建设局党组书记、局长孙玉荣介绍加...
AI成民营银行下一个十年的 关... [ 2024年民营银行整体业绩承压明显。19家银行合计净利润187.76亿元,同比下滑8.14%。 ...
丰林集团股价微跌0.87% 子... 丰林集团股价报2.29元,较前一交易日下跌0.02元,跌幅0.87%。盘中波动区间为2.25元至2....
长安汽车:中国长安汽车集团合计... 长安汽车 视觉中国 资料图 中国长安汽车集团有限公司(下称“中国长安汽车集团”)成立后,A股上市公司...
机构席位卖出456.92万 北... 每经讯,2025年7月29日,北交所上市公司天润科技(430564,收盘价:27.16元)登上龙虎榜...
小麦集中收购即将过半 政策收储... 夏粮小麦集中收购期即将过半,小麦市场供需博弈依旧僵持。当前,政策稳价、稳市意愿仍然较强,但面粉消费需...
珠江啤酒高层变动,“华南王”何... 升任董事长一个月后,黄文胜辞去了珠江啤酒总经理一职。 近日,珠江啤酒披露公告,称因工作调整,黄文胜申...
苹果在美开“制造学院”,AI、... IT之家 7 月 29 日消息,苹果公司宣布,将在底特律开设全新的苹果制造学院(Apple Manu...
首家民营银行半年报,民商银行净... 近日,温州民商银行股份有限公司(下称民商银行)发布了2025年半年度报告,这也是首家发布半年业绩的民...
美股盘前暴跌28%!诺和诺德任... 29日周二,丹麦制药巨头诺和诺德在减肥药销售放缓导致利润预警后,提拔国际业务负责人Maziar Mi...
【广发•早间速递】聚焦再平衡,... 来源:广发证券研究 注:音频如有歧义以研究报告内容为准 研究精选 宏观:6月中游制造行业利润分化 ...
理想汽车,突然直线大跌!中概新... 今晚(7月29日),美股高开后有所回落,截至发稿,道指飘绿,纳指与标普500指数飘红。 个股方面,美...
宝安科创“兽”群图鉴更新!一医... 宝安制造业沃土再添科创标杆!近日,在深圳市工业和信息化局、深圳市中小企业服务局指导举办的2025中国...
轩竹生物:研发人数锐减,融资近... 轩竹生物科技股份有限公司(简称“轩竹生物”),这家专注于消化、肿瘤及非酒精性脂肪肝炎等重大疾病领域的...
爱柯迪涨5.52%,西南证券二... 今日爱柯迪(600933)涨5.52%,收盘报17.0元。 2025年5月2日,西南证券研究员郑连声...
中原高速连跌5天,南方基金旗下... 7月29日,中原高速连续5个交易日下跌,区间累计跌幅-6.76%。河南中原高速公路股份有限公司是经河...
比特币“霸主”地位受威胁,山寨... 比特币的几个月持续上涨,使其价格远超疫情时代的高潮。然而,随着比特币的主流化,投资者开始寻找下一个大...
斥资近8亿元入主4年半 许广彬... 东方材料7月29日晚间公告,许广彬因个人原因申请辞去公司董事长等职务,但辞职后继续担任公司董事。许广...