第十四屆藍橋杯青少組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
英文地址,請注明出處:http://en.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博客 …