第十四届蓝桥杯青少组C++国赛[2023.5.28]第二部分编程题(4、 数独填数)

参考程序:

#include <bits/stdc++.h>
using namespace std;char board[9][9];// 检查在 (r,c) 填 num 是否有效
bool isValid(int r, int c, char num) {for (int i = 0; i < 9; ++i) {if (board[r][i] == num) return false;      // 同行if (board[i][c] == num) return false;      // 同列int br = (r/3)*3 + i/3;int bc = (c/3)*3 + i%3;if (board[br][bc] == num) return false;   // 同 3x3 宫}return true;
}// 回溯 DFS 填数
bool dfs(int r, int c) {if (r == 9) return true; // 已填完所有行,成功if (board[r][c] != '.') {// 已有数字,移动到下一个格子if (c == 8) return dfs(r+1, 0);else return dfs(r, c+1);}for (char num = '1'; num <= '9'; ++num) {if (isValid(r, c, num)) {board[r][c] = num;if (c == 8) {if (dfs(r+1, 0)) return true;} else {if (dfs(r, c+1)) return true;}board[r][c] = '.'; // 回溯}}return false; // 无可行数字,回溯
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);// 输入 9 行for (int i = 0; i < 9; ++i) {string line;cin >> line;for (int j = 0; j < 9; ++j) board[i][j] = line[j];}dfs(0, 0); // 从左上角开始填数// 输出结果for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) cout << board[i][j];cout << '\n';}return 0;
}

参考程序2:

#include <bits/stdc++.h>
using namespace std;char board[9][9];
int rowMask[9], colMask[9], boxMask[9];
vector<pair<int,int>> empties;inline int boxIndex(int r, int c) {return (r/3)*3 + (c/3);
}bool dfs() {// 找还未填且候选数最少的空格(启发式)int bestIdx = -1;int bestCount = 10;int bestMask = 0;for (int k = 0; k < (int)empties.size(); ++k) {int r = empties[k].first;int c = empties[k].second;if (board[r][c] != '.') continue; // 已被填过int mask = ~(rowMask[r] | colMask[c] | boxMask[boxIndex(r,c)]) & 0x1FF; // 9位掩码int cnt = __builtin_popcount(mask);if (cnt == 0) return false; // 无候选 -> 这条路失败,回溯if (cnt < bestCount) {bestCount = cnt;bestIdx = k;bestMask = mask;if (cnt == 1) break; // 已经是最优(1)可直接尝试}}if (bestIdx == -1) {// 没有空格,解出return true;}int r = empties[bestIdx].first;int c = empties[bestIdx].second;int b = boxIndex(r,c);// 依次尝试 bestMask 中的每个候选数字(低位表示数字1)int mask = bestMask;while (mask) {int bit = mask & -mask; // 取最低位 2^dint d = __builtin_ctz(bit); // d in [0..8], 对应数字 (d+1)mask ^= bit;// 放置 d+1board[r][c] = char('1' + d);rowMask[r] |= (1 << d);colMask[c] |= (1 << d);boxMask[b] |= (1 << d);if (dfs()) return true;// 撤销board[r][c] = '.';rowMask[r] &= ~(1 << d);colMask[c] &= ~(1 << d);boxMask[b] &= ~(1 << d);}return false;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);// 读取 9 行,每行可能含空格,保留数字或 '.' 字符直至获得 9 个有效字符for (int i = 0; i < 9; ++i) {string line;if (!getline(cin, line)) return 0; // 非法输入或 EOFstring filtered;for (char ch : line) {if (ch == '.' || (ch >= '1' && ch <= '9')) filtered.push_back(ch);if (filtered.size() == 9) break;}// 若本行过滤后不足9个字符,继续读接下来的行拼满(提高对不规范输入的容错)while (filtered.size() < 9) {string extra;if (!getline(cin, extra)) break;for (char ch : extra) {if (ch == '.' || (ch >= '1' && ch <= '9')) filtered.push_back(ch);if (filtered.size() == 9) break;}}if (filtered.size() != 9) {// 如果输入仍然异常,填充 '.' 保证程序不会越界(实际题目不会出现)filtered.resize(9, '.');}for (int j = 0; j < 9; ++j) board[i][j] = filtered[j];}// 初始化掩码与空格列表fill(begin(rowMask), end(rowMask), 0);fill(begin(colMask), end(colMask), 0);fill(begin(boxMask), end(boxMask), 0);empties.clear();for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {char ch = board[i][j];if (ch >= '1' && ch <= '9') {int d = ch - '1';int b = boxIndex(i,j);rowMask[i] |= (1 << d);colMask[j] |= (1 << d);boxMask[b] |= (1 << d);} else {board[i][j] = '.';empties.emplace_back(i,j);}}}bool ok = dfs();if (!ok) {// 按题意不会发生(保证有效且唯一),但安全处理cout << "No solution\n";return 0;}// 输出结果:9 行,每行 9 个数字,无空格for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) cout << board[i][j];cout << '\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95581.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中奇技淫巧08-使用alloca/__builtin_alloca从栈上分配空间

alloca是什么? alloca 是一个非标准但广泛支持的 C 语言函数&#xff0c;用于在当前函数的栈&#xff08;stack&#xff09;上动态分配内存。 与 malloc 的区别&#xff1a; malloc 在堆&#xff08;heap&#xff09; 上分配内存&#xff0c;需要手动调用 free 释放。alloca 在…

【Markdown转Word完整教程】从原理到实现

Markdown转Word完整教程&#xff1a;从原理到实现 前言 在技术文档编写和学术论文创作中&#xff0c;Markdown因其简洁的语法和良好的可读性而广受欢迎。然而&#xff0c;在实际工作中&#xff0c;我们经常需要将Markdown文档转换为Word格式&#xff0c;以便与同事协作、提交正…

IBM穿孔卡片:现代计算技术的奠基之作

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 打孔卡概述 穿孔卡片&#xff08;Punch Card&#xff09;又称打孔卡…

亚马逊旺季来临如何用woot冲刺

在亚马逊旺季来临之际&#xff0c;使用Woot冲刺需结合新品推广、老品激活、库存清理等不同场景&#xff0c;通过精准选品、活动设置、广告配合及数据监控实现销量与排名的双重提升。以下是具体操作指南&#xff1a;一、精准选品&#xff1a;匹配提报条件新品期选品标准&#xf…

AlexNet:计算机视觉的革命性之作

AlexNet: Revolutionizing Deep Learning for Computer Vision (1)网络提出的背景 论文题目:ImageNet Classification with Deep Convolutional Neural Networks arXiv地址:https://arxiv.org/abs/1207.0575 在2012年ImageNet大规模视觉识别挑战赛(ILSVRC)中,AlexNet以15…

【高等数学】第十一章 曲线积分与曲面积分——第二节 对坐标的曲线积分

上一节&#xff1a;【高等数学】第十一章 曲线积分与曲面积分——第一节 对弧长的曲线积分 总目录&#xff1a;【高等数学】 目录 文章目录1. 对坐标的曲线积分的概念与性质1. 对坐标的曲线积分的概念与性质 变力沿曲线所作的功 先用曲线 LLL 上的点 M1(x1,y1),M2(x2,y2),…,M…

解析SQL Server核心服务与功能

SQL Server 安装后会在 Windows 系统中注册多个服务&#xff0c;每种服务负责不同的功能。主要服务类型包括&#xff1a; &#x1f4cc; 核心服务 (必须或常用)SQL Server Database Engine (数据库引擎服务) 服务名称格式&#xff1a; MSSQL$<InstanceName> (命名实例) 或…

专项智能练习(计算机动画基础)

1.小明在制作Flash作品时&#xff0c;舞台及库中素材如第下图所示&#xff0c;把“马”元件插入到“马”图层第1帧并放在舞台的草地位置&#xff0c;发现舞台中并无马图像显示&#xff0c;下列情形中最有可能的是&#xff08; &#xff09;。A.“马”图层已被锁定 B.“马”图层…

第三方库集成:结合 Express.js 构建本地服务器

引言&#xff1a;Express.js 在 Electron 第三方库集成中的本地服务器构建价值 在 Electron 框架的第三方库集成生态中&#xff0c;Express.js 作为 Node.js 的经典 Web 框架&#xff0c;扮演着构建本地服务器的关键角色。它不仅仅是一个路由和中间件工具&#xff0c;更是 Elec…

百度地图+vue+flask+爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付+图像识别技术

F012 百度地图vueflask爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付图像识别技术 &#x1f4da;编号&#xff1a; F012 文章结尾部分有CSDN官方提供的学长 联系方式名片 博主开发经验15年,全栈工程师&#xff0c;专业搞定大模型、知识图谱、算法和可视化…

# 开发中使用——鸿蒙CoreSpeechKit让文字发声后续

开发中使用——鸿蒙CoreSpeechKit让文字发声后续 设置音量大小 volume// 设置播报相关参数this.extraParam {"queueMode": 0, "speed": AppModel.speed, "volume": AppModel.volume, "pitch": 1, "languageContext": zh-CN,…

Java全栈开发面试实录:从基础到微服务的深度探索

Java全栈开发面试实录&#xff1a;从基础到微服务的深度探索 面试官与应聘者的初次见面 面试官&#xff1a;你好&#xff0c;很高兴见到你。请先做个自我介绍吧。 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;今年28岁&#xff0c;是南京大学计算机科学与技术专业的…

前端路由切换不再白屏:React/Vue 实战优化全攻略(含可运行 Demo)

摘要 在单页应用&#xff08;SPA&#xff09;开发中&#xff0c;React、Vue、Angular 这些主流框架都依赖前端路由来完成页面切换。好处是显而易见的&#xff1a;首屏资源一次加载&#xff0c;后续页面切换靠前端路由完成&#xff0c;体验比传统的多页应用要顺畅很多。 但是在实…

C#之LINQ

文章目录前言LINQ一、LINQ1一、LINQ2一、LINQ3Where方法&#xff1a;每一项数据都会进过predicate的测试&#xff0c;如果针对一个元素&#xff0c;predicate执行的返回值为true&#xff0c;那么这个元素就会放到返回值中。获取一条数据&#xff08;是否带参数的两种写法&#…

第 2 讲:Kafka Topic 与 Partition 基础

课程概述 在第一篇课程中&#xff0c;我们了解了 Kafka 的基本概念和简单的 Producer/Consumer 实现。 本篇课程将深入探讨 Kafka 的核心机制&#xff1a;Topic 和 Partition。 学习目标 通过本课程&#xff0c;您将掌握&#xff1a; Topic 和 Partition 的设计原理&#x…

三阶Bezier曲线曲率极值及对应的u的计算方法

三阶&#xff08;三次&#xff09;Bezier曲线的曲率极值及其对应的参数 u 的计算是一个复杂的非线性优化问题。由于三阶Bezier曲线是参数化曲线&#xff0c;其曲率表达式较为复杂&#xff0c;通常无法通过解析方法直接求得所有极值点&#xff0c;但可以通过求解曲率导数为零的方…

Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。三、Xml序列化序列化就是把想要存储的内容转换为字节序列用于存储或传递。1、序列化我们先创建一个类&#xff0c;之…

java注解、Lambda表达式、Servlet

一、Java注解注解的概念&#xff1a; Java注解是代码中的元数据&#xff0c;可以用于描述其他代码。注解在编译、类加载、运行时被处理&#xff0c;并且不会改变代码逻辑。注解的用途&#xff1a; 提供代码元信息&#xff0c;如 Override 表明一个方法覆盖了父类的方法。 编译检…

【单片机day02】

GPIO&#xff1a;Genral Purpose Input/Output&#xff0c;GPIO是51单片机和外界交互最基本的方式工作模式&#xff1a;输出模式&#xff1a;单片机给定引脚一个电平(高电平(5V) 低电平(0V)),控制引脚实现高低电平输入模式&#xff1a;检测引脚电平变化GPIO水龙头输出模式&…

Java中最常用的设计模式

Java设计模式之结构型—代理模式-CSDN博客 观察者模式详解-CSDN博客 单例模式详解-CSDN博客 Java设计模式之结构型—享元模式-CSDN博客 Java设计模式之创建型—建造者模式-CSDN博客 Java设计模式之结构型—工厂模式-CSDN博客 Java设计模式之结构型—适配器模式-CSDN博客 …