37. 解數獨 - 力扣(LeetCode)

基礎知識要求:

Java: 方法、for循環、if else語句、數組

Python: 方法、for循環、if else語句、列表

題目:?

編寫一個程序,通過填充空格來解決數獨問題。

數獨的解法需?遵循如下規則

  1. 數字?1-9?在每一行只能出現一次。
  2. 數字?1-9?在每一列只能出現一次。
  3. 數字?1-9?在每一個以粗實線分隔的?3x3?宮內只能出現一次。(請參考示例圖)

數獨部分空格內已填入了數字,空白格用?'.'?表示。

示例 1:

輸入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
輸出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解釋:輸入的數獨如上圖所示,唯一有效的解決方案如下所示:

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j]?是一位數字或者?'.'
  • 題目數據?保證?輸入數獨僅有一個解

思路解析:

這個解題思路是一個典型的回溯算法在數獨求解問題上的應用,它非常直觀且易于理解。下面是對這個解題思路的總結:

  1. 初始化
    • 提供一個初始的數獨板(在這個例子中是通過一個二維列表表示的)。
    • 如果數獨板沒有完全填充(即含有.作為占位符),則需要進行求解。
  2. 定義is_valid函數
    • 這是一個輔助函數,用于檢查在給定位置(row, col)填入數字num是否有效。
    • 檢查包括:當前行、當前列以及所在的3x3宮格內是否已存在該數字。
  3. 定義solve_sudoku函數
    • 這是求解數獨的核心函數,它使用回溯法來嘗試填充每一個空格。
    • 對于數獨板上的每一個空格(即值為.的位置):
      • 嘗試填入數字1到9。
      • 如果填入某個數字后,數獨仍然有效(通過is_valid函數檢查),則繼續遞歸地求解剩余的空格。
      • 如果遞歸求解成功(即找到了一個解),則返回True。
      • 如果遞歸求解失敗(即當前數字不合適),則回溯,將該空格重新置為.,并嘗試下一個數字。
    • 如果嘗試完所有數字后仍然沒有找到解,則返回False。
    • 如果所有空格都成功填充,則返回True,表示找到了一個解。
  4. 求解與輸出
    • 調用solve_sudoku函數來求解數獨。
    • 如果求解成功,則打印出解出的數獨板;否則,輸出“無解”。

Java代碼示例:

public class SudokuSolver {  // 檢查數字在行、列和3x3宮格內是否有效  public static boolean isValid(char[][] board, int row, int col, char num) {  // 檢查行  for (int i = 0; i < 9; i++) {  if (board[row][i] == num) {  return false;  }  }  // 檢查列  for (int i = 0; i < 9; i++) {  if (board[i][col] == num) {  return false;  }  }  // 檢查3x3宮格  int startRow = 3 * (row / 3);  int startCol = 3 * (col / 3);  for (int i = 0; i < 3; i++) {  for (int j = 0; j < 3; j++) {  if (board[i + startRow][j + startCol] == num) {  return false;  }  }  }  return true;  }  // 遞歸求解數獨  public static boolean solveSudoku(char[][] board) {  for (int i = 0; i < 9; i++) {  for (int j = 0; j < 9; j++) {  if (board[i][j] == '.') {  for (char num = '1'; num <= '9'; num++) {  if (isValid(board, i, j, num)) {  board[i][j] = num;  // 遞歸嘗試下一個空格  if (solveSudoku(board)) {  return true;  }  // 回溯  board[i][j] = '.';  }  }  // 嘗試完所有數字都不可行,說明當前空格無解,返回false  return false;  }  }  }  // 所有空格都填滿了,說明找到解了  return true;  }  // 主函數,用于測試  public static void main(String[] args) {  char[][] board = {  {'5', '3', '.', '.', '7', '.', '.', '.', '.'},  {'6', '.', '.', '1', '9', '5', '.', '.', '.'},  {'.', '9', '8', '.', '.', '.', '.', '6', '.'},  {'8', '.', '.', '.', '6', '.', '.', '.', '3'},  {'4', '.', '.', '8', '.', '3', '.', '.', '1'},  {'7', '.', '.', '.', '2', '.', '.', '.', '6'},  {'.', '6', '.', '.', '.', '.', '2', '8', '.'},  {'.', '.', '.', '4', '1', '9', '.', '.', '5'},  {'.', '.', '.', '.', '8', '.', '.', '7', '9'}  };  if (solveSudoku(board)) {  // 格式化輸出  for (char[] row : board) {  for (char num : row) {  System.out.print(num + " ");  }  System.out.println();  }  } else {  System.out.println("無解");  }  }  
}

Python代碼示例:

def is_valid(board, row, col, num):  # 檢查行中是否已存在該數字  for i in range(9):  if board[row][i] == num:  return False  # 檢查列中是否已存在該數字  for i in range(9):  if board[i][col] == num:  return False  # 檢查3x3宮格中是否已存在該數字  start_row = 3 * (row // 3)  start_col = 3 * (col // 3)  for i in range(3):  for j in range(3):  if board[i + start_row][j + start_col] == num:  return False  return Truedef solve_sudoku(board):  for i in range(9):  for j in range(9):  if board[i][j] == '.':  for num in ['1', '2', '3', '4', '5', '6', '7', '8', '9']:  if is_valid(board, i, j, num):  board[i][j] = num  if solve_sudoku(board):  return True  # 如果當前數字不合法,回溯  board[i][j] = '.'  # 嘗試完所有數字都不可行,說明無解  return False  # 所有空格都填滿了,說明找到解了  return True  # 示例輸入  
board = [["5","3",".",".","7",".",".",".","."],  ["6",".",".","1","9","5",".",".","."],  [".","9","8",".",".",".",".","6","."],  ["8",".",".",".","6",".",".",".","3"],  ["4",".",".","8",".","3",".",".","1"],  ["7",".",".",".","2",".",".",".","6"],  [".","6",".",".",".",".","2","8","."],  [".",".",".","4","1","9",".",".","5"],  [".",".",".",".","8",".",".","7","9"]]  # 轉換為二維列表  
board = [list(map(str, row)) for row in board]  # 求解數獨  
if solve_sudoku(board):  # 格式化輸出  for row in board:  print(row)  
else:  print("無解")

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

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

相關文章

Windows搭建Nginx代理本地盤的文件(共享路徑或本地路徑)

文章目錄 Windows搭建Nginx代理本地盤的文件 - 前言需求背景掛載網絡共享路徑檢查連接狀態下載Nginx編輯 Nginx 配置文件啟動 Nginx檢測Nginx是否成功啟動使用方法遠程共享路徑示例本地文件示例 測試 Windows搭建Nginx代理本地盤的文件 - 前言 在開發過程中&#xff0c;確保文…

ChatGPT Mac客戶端 下載安裝教程(免費 不限次數使用 還支持語音聊天)

ChatGPT Mac客戶端 下載安裝教程&#xff08;免費 不限次數使用 還支持語音聊天&#xff09; 原文鏈接&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248625 免費 不限次數使用 還支持語音聊天

mysql 排序、查詢執行流程、幻讀

文章目錄 MySQL的 ORDER BY 執行流程示例表和查詢語句執行流程全字段排序Rowid 排序全字段排序 VS rowid排序聯合索引優化覆蓋索引優化 小結思考題問題執行過程中是否需要排序&#xff1f;如何在數據庫端實現不排序&#xff1f;實現分頁需求 使用ORDER BY RAND()內存臨時表與磁…

ANDROID OLLVM 混淆配置

安裝環境 MacOSGITCMAKENDK - 21.1.6352462 步驟 1. 編譯項目 此項目版本較低 https://github.com/obfuscator-llvm/obfuscator &#xff0c;我們使用 https://github.com/heroims/obfuscator 進行編譯 git clone https://github.com/heroims/obfuscator.gitcd obfuscator…

曼城四連冠,劍南春與萬千球迷共同見證“榮耀時刻”

執筆 | 洪大大 編輯 | 揚 靈 5月19日&#xff0c;英超2023-2024賽季第38輪比賽全面開打&#xff0c;憑借隊員的出色發揮&#xff0c;曼城最終以3-1戰勝西漢姆聯&#xff0c;成功捧起了英超聯賽的獎杯&#xff0c;成為英格蘭足球頂級聯賽100多年歷史上第一支成就四連冠的豪門…

事務報錯沒有顯示回滾導致DDL阻塞引發的問題

在業務開發過程中&#xff0c;顯示的開啟事務并且在事務處理過程中對不同的情況進行顯示的COMMIT或ROLLBACK&#xff0c;這是一個完整數據庫事務處理的閉環過程。 這種在應用開發邏輯層面去handle的事務執行的結果&#xff0c;既確保了事務操作的數據完整性&#xff0c;又遵循了…

簡單句語法

簡單句是指包含一個主語和一個謂語的句子&#xff0c;它表達一個完整的思想。簡單句是構成更復雜句子的基礎。 簡單句的兩種基本結構 簡單句可以分為兩種基本結構&#xff1a; 主謂結構: 描述主語所做的動作或行為&#xff0c;也就是 “做什么”。 主系結構: 描述主語的狀態…

Python2和Python3對utf8的實現方式有什么區別?

# -*- coding: utf8 -*- 是一個特殊的文件頭部注釋&#xff0c;通常出現在Python 2的源代碼文件的開頭。這個注釋告訴Python解釋器&#xff0c;該源文件使用的是UTF-8編碼。這對于包含非ASCII字符&#xff08;例如中文字符、特殊符號等&#xff09;的Python源代碼文件來說非常重…

探索未來設計新境界,PSAI插件 藝術創作神器來襲!

想象一下&#xff0c;如果有一個工具&#xff0c;能夠讓你的設計工作變得既簡單又高效&#xff0c;那會是怎樣的體驗&#xff1f;現在&#xff0c;夢想成真了&#xff01; 這是一款革命性的PSAI設計插件&#xff0c;專為創意人士打造。它將徹底改變你的設計流程&#xff0c;讓你…

【OpenCV】像素信息統計

介紹了計算像素均值、方差的API&#xff0c;以及統計像素信息的方法。相關API&#xff1a; minMaxLoc()mean()meanStdDev() 代碼&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv;int main(int…

談談如何建立可落地的數字化轉型戰略

數字化轉型戰略是指將數字技術集成到企業或組織的所有領域&#xff0c;從根本上改變其運營方式以及為客戶提供價值的方式。它涉及采用新技術并重新思考現有業務流程&#xff0c;以提高效率、生產力和客戶滿意度。 成功的數字化轉型戰略需要采用涉及人員、流程和技術的整體方法。…

【全開源】JAVA同城搬家系統源碼小程序APP源碼

JAVA同城搬家系統源碼 特色功能&#xff1a; 強大的數據處理能力&#xff1a;JAVA提供了豐富的數據結構和算法&#xff0c;以及強大的并發處理能力&#xff0c;使得系統能夠快速地處理大量的貨物信息、司機信息、訂單信息等&#xff0c;滿足大規模物流的需求。智能路徑規劃&a…

香橙派 AIPro開發板上手測評

前言 最近拿到了一個新玩具&#xff1a;香橙派 AIPro。一個只比銀行卡大一點點的開發板能帶給我們多少驚喜呢&#xff1f;接下來就跟我一起來體驗下這塊開發板的魅力。 一、硬件配置 CPU&#xff1a;配備了4核64位ARM處理器&#xff0c;其中默認預留1個給AI處理器使用 NPU&am…

SpringBoot和Apache Doris實現實時廣告推薦系統

本專題旨在向讀者深度解讀Apache Doris技術,探討其與SpringBoot框架結合在各類實際應用場景中的角色與作用。本專題包括十篇文章,每篇文章都概述了一個特定應用領域,如大數據分析、實時報告系統、電商數據分析等,并通過對需求的解析、解決方案的設計、實際應用示例的展示以…

【Python實戰】你還在沖會員看電影電視劇嗎?Python帶你實現各大資源免費看!

前言 halo&#xff0c;包子們下午好 今天給大家實現一個視頻播放器&#xff0c;可以看任何電影&#xff0c;電視劇&#xff0c;不要再為以后看電視看電影而煩惱&#xff0c;今天是福利文章&#xff0c;相信我絕對有用&#xff01; 開發工具 Python版本&#xff1a;3.7.8 相…

Java Lambda 會影響性能嗎?

# 測試代碼LamdaTest.java import java.util.*;class LamdaTest {static volatile List<Integer> integers new ArrayList<Integer>();// 普通 for 循環測試public static int forLoopInteger() {int total 0;for (int i 0; i < integers.size(); i) {total…

驅動未來:IT行業的現狀與發展趨勢

前言 隨著技術的不斷進步&#xff0c;IT行業已成為推動全球經濟和社會發展的關鍵力量。從云計算、大數據、人工智能到物聯網、5G通信和區塊鏈&#xff0c;這些技術正在重塑我們的生活和工作方式。本文將探討IT行業的現狀和未來發展趨勢&#xff0c;并邀請行業領袖、技術專家和…

Follow Your Pose: Pose-Guided Text-to-Video Generation using Pose-Free Videos

清華深&港科&深先進&Tencent AAAI24https://github.com/mayuelala/FollowYourPose 問題引入 本文的任務是根據文本來生成高質量的角色視頻&#xff0c;并且可以通過pose來控制任務的姿勢&#xff1b;當前缺少video-pose caption數據集&#xff0c;所以提出一個兩…

Java的上下轉型與多態

上下轉型 首先&#xff0c;定義一個父類Person // 父類 class Person {public void run(){System.out.println("person 中的 run");}public void eat(){System.out.println("Person 中的 eat");}}接著定義一個繼承自父類的子類Student: // 子類 class S…

拿捏數據結構- 鏈式二叉樹

鏈式二叉樹的概念&#xff1a; 鏈式二叉樹解決的是非完全二叉樹解決不了的問題 什么意思呢&#xff0c;簡單的說就是&#xff0c;鏈式二叉樹 可以是下面三種二叉樹 但是非鏈式二叉樹只能是前兩種 鏈式二叉樹的存儲 節點結構&#xff1a;首先定義一個結構體或類來表示二叉樹的節…