數獨游戲(dfs)

在這里插入圖片描述

代碼注釋如下
#include <iostream>
using namespace std;
const int N = 10;
bool col[N][N], rol[N][N], cell[3][3][N];
char g[N][N];
bool dfs(int x, int y) {    //用bool這樣在找到一個方案就可以迅速退出if(y == 9)  x++, y = 0;     //若y超出邊界,則第二行開始y = 0,x++if(x == 9)  {for(int i = 0; i < 9; i++) cout << g[i] << endl;return true;//這里返回true讓下面for里面中間的dfs直接結束,不在回溯,少枚舉很多情況//并且是輸出唯一解}if(g[x][y] != '.')  return dfs(x, y + 1);//g[x][y] == '.'for(int i = 0; i < 9; i++) {if(!col[y][i] && !rol[x][i] && !cell[x / 3][y / 3][i]) {g[x][y] = i + '1';col[y][i] = rol[x][i] = cell[x / 3][y / 3][i] = true;if(dfs(x, y + 1))   return true;//剪枝,dfs返回值是true上面輸出了答案,不用再回溯,并且//這一枝遞歸直接結束。//恢復操作g[x][y] = '.';col[y][i] = rol[x][i] = cell[x / 3][y / 3][i] = false;}}return false;//如果某個方案失敗,需要返回false讓上面回溯//不加這個也不會輸出結果,因為如果這一枝遞歸沒成功,返回false上面才能回溯
}
int main() {for(int i = 0; i < 9; i++) {     cin >> g[i];for(int j = 0; j < 9; j++) {if(g[i][j] != '.') {int x = g[i][j] - '1';  //1-9映射到0-8(方便cell的下取整操作)rol[i][x] = true;col[j][x] = true;cell[i / 3][j / 3][x] = true;}}   }dfs(0, 0);return 0;
}

補充

//這樣寫也是對的,只不過沒有剪枝,時間復雜度高些
bool dfs(int x, int y)
{if (y == 9) x ++, y = 0;if (x == 9){for (int i = 0; i < 9; i ++ ) cout << g[i] << endl;return true;}if (g[x][y] != '.') return dfs(x, y + 1);for (int i = 0; i < 9; i ++ )if (!row[x][i] && !col[y][i] && !cell[x / 3][y / 3][i]){g[x][y] = i + '1';row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;dfs(x, y + 1);//不同點row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;g[x][y] = '.';}//沒有返回值
}

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

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

相關文章

S1---FPGA硬件板級原理圖實戰導學

視頻鏈接 FPGA板級實戰導學01_嗶哩嗶哩_bilibili FPGA硬件板級原理圖實戰導學 【硬件電路設計的方法和技巧-嗶哩嗶哩】硬件電路設計的方法和技巧01_嗶哩嗶哩_bilibili&#xff08;40min&#xff09; 【高速板級硬件電路設計-嗶哩嗶哩】 高速板級硬件電路設計1_嗶哩嗶哩_bil…

【RT-Thread基礎教程】郵箱的使用

文章目錄 前言一、郵箱的特性二、郵箱操作函數2.1 創建郵箱創建動態郵箱創建靜態郵箱 2.2 刪除郵箱2.3 發郵件2.4 取郵件 三、示例代碼總結 前言 RT-Thread是一個開源的實時嵌入式操作系統&#xff0c;廣泛應用于各種嵌入式系統和物聯網設備。在RT-Thread中&#xff0c;郵箱是…

輸入一個整數,輸出其最長連續因子。

輸入一個整數&#xff0c;輸出其最長連續因子。 例如 輸入&#xff1a;60 輸出&#xff1a;2 3 4 5 6 注意&#xff1a;1不算因子 輸入輸出格式 輸入描述: 輸入一個整數N&#xff0c;N<10000。 輸出描述: 輸出其最長連續因子&#xff0c;如果有多個最長&#xff0c;輸出…

HTML5浮動

1.標準文檔流組成 塊級元素&#xff08;block&#xff09; 內聯元素&#xff08;inline&#xff09; 2.display屬性 作用&#xff1a;指定HTML標簽的顯示方式 常用屬性 值 說明 block 塊級元素的默認值&#xff0c;元素會被顯示為塊級元素&#xff0c;該元素前后會帶有換行…

Linux UnixODBC安裝配置

配置 UnixODBC 夢之上關注IP屬地: 香港 0.2322020.12.09 13:23:10字數 1,202閱讀 5,447 麒麟&達夢適配系列: 1.麒麟服務器上安裝 DM8 2.配置 UnixODBC 3.beego-ORM 適配達夢 資源緊張的時候&#xff0c;服務器是大家共用的&#xff0c;上面部署了一堆服務。所以選用doc…

Lua速成(7)

一、Lua 元表(Metatable) 在 Lua table 中我們可以訪問對應的 key 來得到 value 值&#xff0c;但是卻無法對兩個 table 進行操作(比如相加)。 因此 Lua 提供了元表(Metatable)&#xff0c;允許我們改變 table 的行為&#xff0c;每個行為關聯了對應的元方法。 例如&#xf…

ShardingJdbc實戰-分庫分表

文章目錄 基本配置分庫分表的分片策略一、inline 行表達時分片策略algorithm-expression行表達式完整案例和配置如下 二、根據實時間日期 - 按照標準規則分庫分表標準分片 - Standard完整案例和配置如下 基本配置 邏輯表 邏輯表是指&#xff1a;水平拆分的數據庫或者數據表的相…

SpringBoot實戰(1)

SpringBoot總結 一,Spring 設計思想 OOP: 面向對象編程-》封裝、繼承、多態 BOP: 面向Bean編程-》一切從Bean開始 AOP: 面向切面編程-》解藕、專 人做專事 IOC: 控制反轉,將new 對象的操作交給Spring統一管理-》轉交控制權 DI/DL: 依賴注入/依賴查找-》自動賦值 DI和AOP…

LLVM 一些重要文檔 LLVM 3.0

基于LLVM 3.0: Documentation for the LLVM System at SVN head LLVM 作為庫的使用方法&#xff1a; Using The LLVM Libraries LLVM C 的編程規范&#xff1a; LLVM Coding Standards

stl 迭代器(Iterator)

定義 迭代器&#xff08;Iterator&#xff09;是STL&#xff08;Standard Template Library&#xff0c;標準模板庫&#xff09;中的一個核心概念&#xff0c;用于提供一種通用的方式來遍歷容器&#xff08;如vector、list、map等&#xff09;中的元素&#xff0c;而無需暴露容…

大小端問題

0. 介紹 大小端計算機存儲數據而安排字節的兩種順序。 針對的是字節。 大端與我們平時書寫的順序一致。 1. 大小端的判定 不需要手動判斷。 有一個頭文件endian.h; 可能會有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通過庫來進行判斷。 手動判斷 根據字節存取的順序…

【JSON2WEB】07 Amis可視化設計器CRUD增刪改查

總算到重點中的核心內容&#xff0c;CRUD也就是增刪改查&#xff0c;一個設計科學合理的管理信息系統&#xff0c;95%的就是CRUD&#xff0c;達不到這個比例要重新考慮一下你的數據庫設計了。 1 新增頁面 Step 1 啟動amis-editor Setp 2 新增頁面 名稱和路徑隨便命名&#xf…

Dynamo幕墻探究系列(一)

一直想寫個系列教程&#xff0c;但是沒有那么多時間整理資料&#xff0c;這次呢&#xff0c;先弄個小系列吧&#xff0c;還是和之前差不多的幕墻測試&#xff0c;我們分幾節課&#xff0c;一步一步深入研究。 今天先開個小頭兒&#xff0c;要弄的&#xff0c;就是下面這么個模型…

對象鎖與類鎖

不同鎖互不影響&#xff0c;共用一個鎖&#xff0c;可能會發生阻塞。 1.在修飾靜態方法時&#xff0c;鎖定的是當前類的 Class 對象&#xff0c;在下面的例子中就是SycTest1.class 2.當修飾非靜態方法時&#xff0c;鎖定的就是 this 對象&#xff0c;即當前的實例化對象 public…

【Git教程】(四)版本庫 —— 存儲系統,存儲目錄,提交對象及其命名、移動與復制~

Git教程 版本庫 1?? 一種簡單而高效的存儲系統2?? 存儲目錄&#xff1a;Blob 與 Tree3?? 相同數據只存儲一次4?? 壓縮相似內容5?? 不同文件的散列值相同6?? 提交對象7?? 提交歷史中的對象重用8?? 重命名、移動與復制&#x1f33e; 總結 事實上&#xff0c;我們…

keil MDK安裝armcc V5編譯器

不知道從什么時候開始&#xff0c;Keil MDK默認不支持V5的編譯器了&#xff0c;里面默認只有V6的編譯器&#xff0c;設置界面跟V5有很大的差異不太熟悉。最可怕的是&#xff0c;之前使用V5編譯的工程&#xff0c;換成V6編譯器后居然報錯...雖然修改一下應該也可以正常編譯&…

神經網絡基礎知識:LeNet的搭建-訓練-預測

1.參考視頻&#xff1a; 2.1 pytorch官方demo(Lenet)_嗶哩嗶哩_bilibili 2.總結&#xff1a; &#xff08;1&#xff09;LeNet網絡就是 我最開始用來預測mnist數據集的那個網絡&#xff0c;簡單的2個conv2個maxpool3個linear層 &#xff08;2&#xff09;up主整理的train.py…

SQL面試題(2)

第一題 創建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

web自動化筆記九:驗證碼的處理方式

一、驗證碼常用的處理方式 ①、說明&#xff1a;Selenium中并沒有對驗證碼處理的方法&#xff0c;在這里我們介紹一下針對驗證碼的幾種常用處理方式 ②、方式&#xff1a; 1&#xff09;、去掉驗證碼&#xff08;測試環境下采用&#xff09; …

RDD算子介紹

1. RDD算子 RDD算子也叫RDD方法&#xff0c;主要分為兩大類&#xff1a;轉換和行動。轉換&#xff0c;即一個RDD轉換為另一個RDD&#xff0c;是功能的轉換與補充&#xff0c;比如map&#xff0c;flatMap。行動&#xff0c;則是觸發任務的執行&#xff0c;比如collect。所謂算子…