算法題(103):數獨

審題:

本題需要我們找出數獨的解,并打印出來

時間復雜度分析:

本題是9*9的數獨格子,所以數據量小于25,可以使用2^n的算法

思路:

方法一:深度優先搜索

首先確定搜索及插入策略:

我們采用逐個搜索插入數字1~9的策略,所以dfs的參數需要包括行數和列數。而插入需要滿足的條件是行,列,九宮格都沒有該數字。我們采用bool類型的row[行數][num],col[列數][num],matrix[行數/3][列數/3][num]來記錄是否插入。

注意:

matrix表示的就是3*3的九宮格,而我們利用行數/3以及列數/3的方法可以使九宮格內的數據都被歸類到一塊,然后即可表示該num在九宮格內的插入狀態

圖示:

確定遞歸進入前提:

由于本題初始矩陣存在著一些給定的非0數據,所以我們遇到初始數據就直接進行下一個格子的dfs搜索即可

確定遞歸深入邏輯:

我們對1~9的數在當前坐標插入是否合法依次判斷,若合法就將數字插入到結果數組上,并更新行,列,九宮格的bool數組狀態。

不合法就繼續判斷下一個數字是否合法,直到循環退出了我們就返回false(因為此時所有數字都無法插入)

確定遞歸回溯邏輯:

由于數獨只存在一個正確解法,所以我們不是對于每一次回溯都要回退插入狀態的,只有當

dfs返回的是false才要回退,返回true說明找到了,不進行回退

確定遞歸退出邏輯:

當行數超出9時,說明全部插入成功了,直接返回true。

解題:

#include<iostream>
using namespace std;
int v[9][9];
bool row[10][10], col[10][10], matrix[10][10][10];

(1)main函數邏輯

int main()
{//錄入數據for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){cin >> v[i][j];int num = v[i][j];//記錄已有數字格子if (v[i][j] != 0){row[i][num] = col[j][num] = matrix[i / 3][j / 3][num] = true;}}}//搜索dfs(0, 0);//基0//輸出for (auto& a : v){for (auto& b : a){cout << b << " ";}cout << endl;}return 0;
}

在錄入數據的時候記得把已有數據的行/列/九宮格狀態更新。

(2)dfs

//深度優先搜索
bool dfs(int rows, int cols)
{//結束條件if (rows > 8){return true;}//跳過已有數字的格子if (v[rows][cols] != 0){if (cols < 8){return dfs(rows, cols + 1);}else{return  dfs(rows + 1, 0);}}//遞歸for (int i = 1; i <= 9; i++){if (row[rows][i] || col[cols][i] || matrix[rows / 3][cols / 3][i]){}else{v[rows][cols] = i;matrix[rows / 3][cols / 3][i] = col[cols][i] = row[rows][i] = true;bool judge;if (cols < 8){judge = dfs(rows, cols + 1);}else{judge = dfs(rows + 1, 0);}//回溯數據if (!judge){v[rows][cols] = 0;matrix[rows / 3][cols / 3][i] = col[cols][i] = row[rows][i] = false;}else{return true;}}}return false;
}

(1)由于我們是一個個搜索,所以我們進入深層遞歸前需要進行判斷,若列數沒到9就可以進入行數不變,列數++的位置搜索,若列數超了,那就進入行數++,列數為1搜索。

(2)本題之所以從0索引開始,是為了支持行數/3和列數/3的算法,因為從1索引開始的話,我們的第三行/第三列就無法歸為0九宮格,而是3/3==1歸為1九宮格了

P1784 數獨 - 洛谷

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74069.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

snmp/mib采用子代理模式,編碼,部署

0.環境 0.1 編譯net-snmp cd net-snmp-5.7.2 ./configure --prefix/usr/local/snmp BEGIN failed--compilation aborted at Makefile.PL line 1. make: *** [perlmakefiles] Error 2 yum install cpan -y make && make install /…

# [RPA] 使用八爪魚進行高效網頁數據采集

在許多行業中&#xff0c;數據是核心資產。然而&#xff0c;雖然許多網站的文本內容可以免費訪問&#xff0c;但手動一條一條采集&#xff0c;不僅耗時耗力&#xff0c;還容易出錯。這種情況下&#xff0c;使用自動化工具來提高采集效率就顯得尤為重要。本文將介紹 八爪魚 這一…

IDI_APPLICATION 與 IDC_ARROW資源存放在工程的哪個路徑?

書籍&#xff1a;《windows程序設計(第五版)》的開始 環境&#xff1a;visual studio 2022 內容&#xff1a;HELLOWIN程序 說明&#xff1a;以下內容大部分來自騰訊元寶。 IDI_APPLICATION 和 IDC_ARROW 是 ?Windows 系統預定義的資源標識符&#xff0c;它們并不以文件形式…

算法 | 優化算法比較

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 優化算法 ?一、主流優化算法分類?1?、傳統梯度類算法?2?、啟發式算…

騰訊云HAI1元體驗:輕松調用DeepSeek-R1模型搭建網站

前言 隨著云計算和人工智能技術的不斷發展&#xff0c;構建和部署智能化的網頁變得越來越簡單。騰訊云提供的HAI&#xff08;人工智能平臺&#xff09;和DeepSeek&#xff08;智能搜索引擎&#xff09;服務&#xff0c;能幫助開發者快速搭建智能化網頁&#xff0c;提升用戶體驗…

AI Agent系列(七) -思維鏈(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技術詳解1.1 CoT組成1.2 CoT的特點 二、CoT的作用三、CoT的好處四、CoT適用場景五、CoT的推理結構 前言 思維鏈(Chain of Thought,CoT)&#xff0c;思維鏈就是一系列中間的推理步驟(a series of intermediate reasoning steps)&#xff0c;通過…

【一起來學kubernetes】21、Secret使用詳解

Secret 的詳細介紹 Secret 是 Kubernetes 中用于存儲和管理敏感信息&#xff08;如密碼、令牌、密鑰等&#xff09;的資源對象。Secret的設計目的是為了安全地存儲和傳輸敏感信息&#xff0c;如密碼、API密鑰、證書等。這些信息通常不應該直接硬編碼在配置文件或鏡像中&#x…

opencv中stitch圖像融合

openv版本: opencv249 vs &#xff1a;2010 qt : 4.85 #include "quanjing.h"#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <open…

1201. 【高精度練習】蜜蜂路線

題目描述 一只蜜蜂在圖5.1-2所示的數字蜂房上爬動&#xff0c;已知它只能從標號小的蜂房爬到標號大的相鄰蜂房&#xff0c; 現在問你&#xff1a;蜜蜂從蜂房M開始爬到蜂房N&#xff0c;l≤M 輸入 M&#xff0c;N的值。 輸出 一個數表示爬行路線種數。 樣例輸入 1 14 樣…

linux下基本命令和擴展命令(安裝和登錄命令、文件處理命令、系統管理相關命令、網絡操作命令、系統安全相關命令、其他命令)歡迎補充噢

基本命令 ls: 列出目錄內容 ls&#xff1a;列出當前目錄內容ls -l&#xff1a;以長格式列出&#xff08;顯示詳細信息&#xff09;ls -a&#xff1a;顯示隱藏文件ls -lh&#xff1a;以易讀格式顯示文件大小 pwd: 顯示當前工作目錄 pwd&#xff1a;顯示當前目錄的絕對路徑 cd:…

《C++11 基于CAS無鎖操作的atomic原子類型》

count; count--; 我們知道&#xff0c;/--操作并不是原子性的&#xff0c;其實對應三條匯編指令來完成的。 讀取&#xff1a;從內存中把變量的值讀取到寄存器修改&#xff1a;在寄存器里將變量的值1/-1寫入&#xff1a;把修改后的值寫入到內存 在單線程環境下&#xff0c;這…

C++常用多線程模式

文章目錄 1. Fork - Join模式2. Producer - Consumer模式3. Readers - Writers模式4. Work Thread模式5. Actor模式6、 Pipeline模式概述應用場景C實現示例代碼解釋 1. Fork - Join模式 原理&#xff1a;將一個大任務分解為多個子任務&#xff0c;這些子任務在不同的線程中并行…

【時時三省】(C語言基礎)習題2 scanf函數

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 用下面的scanf函數輸入數據&#xff0c;使a 3&#xff0c;b 7&#xff0c;x 8.5&#xff0c;y 71.82&#xff0c;c1 A&#xff0c;c2 x在鍵盤上應如何輸入? 分析第一個 scanf 函數&…

微信小程序計算屬性與監聽器:miniprogram-computed

小程序框架沒有提供計算屬性相關的 api &#xff0c;但是官方為開發者提供了拓展工具庫 miniprogram-computed。 該工具庫提供了兩個功能&#xff1a; 計算屬性 computed監聽器 watch 一、安裝 miniprogram-computed 在項目的根目錄下&#xff0c;使用如下命令&#xff0c;…

SOFAStack-00-sofa 技術棧概覽

SOFAStack 前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 &#x1f31f; 核心項目 ?? SOFABoot GitHub: sofastack/sofa…

企業模板(QiMoban)是一個專注于企業官網搭建的高效平臺

企業模板(QiMoban.com )是一個專注于為企業提供高效、低成本網站建設解決方案的平臺&#xff0c;主要面向中小企業和創業者。其核心優勢在于幫助用戶快速搭建企業官網&#xff0c;提升品牌形象并拓展業務渠道。以下是關于企業模板(QiMoban.com )的詳細分析&#xff1a; 適用場…

Oracle 數據庫安全評估(DBSAT)簡明過程

下載DBSAT 從這里下載。 實際是從MOS中下載&#xff0c;即&#xff1a;Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)。 最新版本為3.1.0 (July 2024)&#xff0c;名為dbsat.zip&#xff0c;近45MB。 $ ls -lh dbsat.zip -rw-rw-r-- 1 oracle oins…

【Linux 維測專欄 1 -- Hung Task 分析與驗證】

文章目錄 Linux Hung Task 簡介1. Hung Task 概述2. D 狀態與 Hung Task3. Hung Task 的工作原理4. Hung Task 的配置5. Hung Task 的典型輸出6. Hung Task 的應用場景7. kernel 配置7.1 編譯選項7.2 參數控制7.3 驗證方法4. 擴展接口 8. 注意事項 Linux Hung Task 簡介 1. Hu…

GCC 預定義宏:解鎖編譯器的隱藏信息

GCC 預定義宏&#xff1a;解鎖編譯器的隱藏信息 在 GCC 編譯器中&#xff0c;有許多內置的預定義宏&#xff0c;它們可以提供編譯環境的信息&#xff0c;如文件名、行號、時間、版本等。這些宏在調試、日志記錄、條件編譯等場景中非常有用。本文將介紹常見的 GCC 預定義宏&…

公鏈開發費用及其構成內容詳析

在區塊鏈技術迅速發展的今天&#xff0c;公鏈&#xff08;Public Blockchain&#xff09;作為去中心化、不可篡改、高安全性的重要應用之一&#xff0c;在金融、供應鏈、游戲等多個領域得到了廣泛應用。然而&#xff0c;開發一條公鏈并非易事&#xff0c;它不僅需要高度專業技能…