藍橋杯第1022題 玩具蛇 基礎DFS C++ Java

題目

思路和解題方法

  1. 問題理解:此題要求找出將一條由16節正方形構成的玩具蛇放入4x4的方格中的不同方式數。每節蛇可以是直線或直角轉彎,且蛇的形狀需要完全覆蓋盒子里的16個格子,每個格子僅被蛇的一個部分占據。

  2. 狀態表示:使用一個二維數組st[4][4]來標記每個格子是否被蛇占用(0表示未占用,1表示占用)。同時,使用深度優先搜索(DFS)來探索所有可能的放置方式。

  3. DFS策略

    • 參數定義dfs(x, y, len)函數中,xy表示當前蛇頭的位置坐標,len表示當前已經放置蛇的節段數目。
    • 遞歸終止條件:當len達到16時,說明蛇的所有部分都已放置完畢,方案數加1。
    • 邊界判斷與重復檢查:每次嘗試移動前,先檢查新位置是否在邊界內以及是否已訪問過。
    • 移動方向:對于當前位置,嘗試向上、下、左、右四個方向移動,每次移動后遞歸調用自身,探索新的路徑。
    • 回溯:在每個方向探索結束后,需要恢復現場,即撤銷當前位置的占用標記,以允許探索其他路徑。
  4. 代碼實現

    • 首先遍歷所有可能的起始位置,對每個起始位置調用dfs函數。
    • dfs函數中,進行上述邏輯處理,包括移動、計數、回溯等操作。

c++ 代碼

#include <iostream>
using namespace std;// 方向數組,dx表示行變化,dy表示列變化,分別對應上、下、左、右四個方向
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};// st數組用來標記網格中的每個格子是否已經被蛇占用過
int st[4][4];      // res用于記錄可以成功放置玩具蛇的總方案數
int res = 0;       // 深度優先搜索函數,探索放置蛇的路徑
void dfs(int x, int y, int len) {// 如果當前位置超出網格范圍,則返回if (x < 0 || y < 0 || x >= 4 || y >= 4) {return;  }// 如果當前位置已經走過,則返回,避免重復路徑if (st[x][y] == 1) {return;  }// 如果蛇的長度已經達到15(即全部擺放完畢),方案數加一并返回if (len == 15) {res++;   return;}// 標記當前位置已被占用st[x][y] = 1;  // 依次嘗試向上、下、左、右四個方向進行下一步探索for (int i = 0; i < 4; i++) {dfs(x + dx[i], y + dy[i], len + 1);  }// 回溯:恢復當前位置為未訪問狀態,以便進行其他路徑的探索st[x][y] = 0;  
}// 主函數
int main() {// 遍歷網格的每一個起點,啟動深度優先搜索尋找所有可能的蛇形路徑for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {dfs(i, j, 0);}}// 輸出所有可行的蛇形路徑總數cout << res << endl;  return 0;
}

Java 版本(僅供參考)

import java.util.Arrays;public class Main {static int[][] st = new int[4][4];      static int res = 0;       static int[][] dx_dy = {{-1, 0, 1, 0}, {0, -1, 0, 1}};  public static void dfs(int x, int y, int len) {if (x < 0 || y < 0 || x >= 4 || y >= 4) {return;  }if (st[x][y] == 1) {return;  }if (len == 15) {res++;   return;}st[x][y] = 1;  for (int i = 0; i < 4; i++) {dfs(x + dx_dy[0][i], y + dx_dy[1][i], len + 1);  }st[x][y] = 0;  }public static void main(String[] args) {Arrays.stream(st).forEach(row -> Arrays.fill(row, 0)); // 初始化st數組for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {dfs(i, j, 0);}}System.out.println(res);  }
}

Python 版本(僅供參考)

def dfs(x, y, len):if x < 0 or y < 0 or x >= 4 or y >= 4:returnif st[x][y] == 1:returnif len == 15:global resres += 1returnst[x][y] = 1for i in range(4):dfs(x + dx[i], y + dy[i], len + 1)st[x][y] = 0dx, dy = [-1, 0, 1, 0], [0, -1, 0, 1]
st = [[0]*4 for _ in range(4)]
res = 0for i in range(4):for j in range(4):dfs(i, j, 0)print(res)

代碼細節:

  • 遞歸函數dfs(x, y, len)負責實際的搜索過程,其中(x, y)是當前探索的位置,len表示已經探索了多少個格子(即蛇的長度)。
  • 邊界檢查:在嘗試移動到新位置之前,先檢查新位置是否還在網格范圍內,防止越界。
  • 重復檢查:通過st數組避免重復訪問同一格子,提高搜索效率,減少無效分支。
  • 遞歸終止條件:當蛇的長度達到16時,說明找到了一個完整的解決方案,累加結果計數器res
  • 回溯:在遞歸返回前,撤銷當前位置的占用標記,以便于從當前節點出發探索其他路徑。
  • 全面搜索:通過外層循環遍歷所有可能的起始點,確保從每個格子出發都嘗試尋找解。

覺得有用的話可以點點贊,支持一下。

如果愿意的話關注一下。會對你有更多的幫助。

每天都會不定時更新哦? >人<? 。

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

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

相關文章

爺爺看了都會,打工人必備的摸魚AI神器!免費!

去年&#xff0c;AI技術無疑成為了最為引人注目的焦點&#xff0c;層出不窮的創新應用令人目不暇接。盡管許多人對這股AI熱潮的持久性持懷疑態度&#xff0c;但現實卻用事實給予了最有力的反駁。AI所展現出的強大生產力&#xff0c;足以令人刮目相看。 而今年以來&#xff0c;…

springboot鏈接kafka異步發送消息

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency> spring:kafka:bootstrap-servers:- ip:端口producer:retries: 0acks: 1batch-size: 16384properties:linger:ms: 100buff…

centos 記錄用戶登陸ip和執行命令

centos 記錄用戶登陸ip和執行命令 在/etc/profile 文件末尾添加如下代碼&#xff1a; #!/bin/bash USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g HISTDIR/usr/share/.history if [ -z "$USER_IP" ]; then USER_IPhostname fi…

VUE3學習第一篇:啟動ruoyi

1、找到ruoyi的vue3版本 然后下載代碼到本地&#xff0c; 我剛開始用的nodejs14報錯&#xff0c; 后面換成nodejs16&#xff0c;啟動前端成功了。 頁面如下圖所示

go panic

panic 能夠改變程序的控制流&#xff0c;調用 panic 后會立刻停止執行當前函數的剩余代碼&#xff0c;并在當前 goroutine 中遞歸執行調用方的 defer。 // A _panic holds information about an active panic. // // A _panic value must only ever live on the stack. // // …

【JPCS出版,EI穩定檢索會議推薦】第四屆計算機、遙感與航空航天國際學術會議(CRSA 2024)已成功申請JPCS出版,火熱征稿中!

【EI核心、Scopus】第四屆計算機、遙感與航空航天國際學術會議&#xff08;CRSA 2024&#xff09;將于2024年7月5-7日在日本大阪舉行。計算機、遙感與航空航天國際學術會議為來自世界各地的研究學者、工程師、學會會員以及相關領域的專家們提供一個關于“計算機科學”、“遙感技…

體驗SmartEDA的高效與便捷,電子設計從未如此簡單

SmartEDA&#xff1a;革新電子設計&#xff0c;讓高效與便捷觸手可及 在快節奏的現代生活中&#xff0c;科技日新月異&#xff0c;各行各業都在尋求更高效、更便捷的解決方案。對于電子設計行業而言&#xff0c;SmartEDA的出現&#xff0c;無疑是一場革命性的變革。它以其高效…

【PG16】后 EL 7 時代,PG 16 如何在 CentOS 7 上運行

↑ 關注“少安事務所”公眾號&#xff0c;歡迎?收藏&#xff0c;不錯過精彩內容~ ★ 本文寫于 2023-09-29 PostgreSQL 16 Released 9/14, PostgreSQL 16 正式發布。從發布公告^1 和 Release Notes^2 可以看到 PG16 包含了諸多新特性和增強改進。 性能提升&#xff0c;查詢計劃…

快速核對兩個表格數據

快速核對兩個表格數據的方法取決于數據的規模、復雜性以及你使用的工具。以下是一些常見的方法&#xff1a; 使用Excel或其他電子表格軟件: VLOOKUP 或 HLOOKUP 函數&#xff1a;這些函數可以在一個表格中查找與另一個表格匹配的值&#xff0c;并返回對應的結果。條件格式&…

Genzai:一款針對物聯網安全的多功能實用性工具套件

關于Genzai Genzai是一款針對物聯網安全的多功能實用性工具套件&#xff0c;該工具旨在識別與物聯網相關的儀表盤&#xff0c;并掃描它們以查找默認密碼和安全問題&#xff0c;廣大研究人員可以使用該工具來檢測和提升物聯網設備的安全性。 Genzai支持用戶以輸入的形式提供一個…

npm install安裝時卡死時嘗試切換npm鏡像地址

當使用npm時&#xff0c;為了提高下載速度和穩定性&#xff0c;特別是針對國內的開發者&#xff0c;經常需要配置國內的鏡像源&#xff0c;如淘寶npm鏡像。以下是如何添加淘寶源等鏡像內容的詳細步驟和說明&#xff1a; 1. 淘寶npm鏡像地址 淘寶npm鏡像的地址在2022年6月30日…

簡愛的思維導圖怎么做?從這三個角度

簡愛的思維導圖怎么做&#xff1f;《簡愛》作為夏洛蒂勃朗特的代表作&#xff0c;不僅是一部經典的愛情小說&#xff0c;也是探索女性獨立與自我成長的文學巨著。為了深入理解這部作品&#xff0c;制作思維導圖是一種高效的學習和分析工具。以下是三種不同的角度來創建《簡愛》…

探討開源與閉源大模型在AI領域的發展前景與挑戰

一、引言 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;大模型已成為推動AI技術進步的核心動力。在AI大模型的發展過程中&#xff0c;開源與閉源兩種不同的發展路徑各自展現出了獨特的發展前景與挑戰。本文將深入探討這兩種路徑在AI領域的發展前景&#…

在馬達驅動上的MOS產品選型分析與應用

電機的應用非常廣泛&#xff0c;可以說大部分動的產品內部都有電機的身影&#xff0c;其主要的應用領域有風機、泵、散熱風扇、電動工具、智能家居、以及汽車應用等等。隨著各國出臺了更加嚴格的用電標準&#xff0c;節能電機成為了市場關注的熱點&#xff0c;而BLDC電機具有高…

K8S集群中Yaml文件詳解

目錄 一、Yaml概述 二、Yaml基本語法 三、Yaml數據結構 四、K8S資源清單描述方法 五、api資源版本標簽 六、Yaml文件示例詳解 1.deployment.yaml文件詳解 2.Pod yaml文件詳解 3.Service yaml文件詳解 七、Yaml文件相關操作 1.試運行 2.生成yaml格式 3.生成json格式…

手搓順序表(C語言)

目錄 SeqList.h SeqList.c 頭插尾插復用任意位置插入 頭刪尾刪復用任意位置刪除 SLtest.c 測試示例 順序表優劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…

深入分析C#中的“編寫器”概念——代碼修改、注解與重構

文章目錄 1. 編寫器&#xff08;Writer&#xff09;的概念2. 編寫器的作用和工作原理3. 編寫器的重要性4. 寫入器常用方法5. 寫入器示例6. 編寫器示例——使用Fody進行代碼注解和重構7. 總結 在軟件開發過程中&#xff0c;代碼的維護和更新是至關重要的。C#作為一種流行的編程語…

單詞學習——不斷更新

suppress: sup - press 抑制&#xff0c;鎮壓 subtle: sub - tle 微妙的 suspend: sus - pend 延緩&#xff0c;懸掛 supplement: sup - ple - ment: 補充 suspicious: sus - pi - cious 可疑的 depress: de -press 壓抑 emit: e - mit 發出 entail: en - tail 涉及 fo…

3.00001 postgres如何初始化系統參數?

文章目錄 加載參數整體流程參數結構舉例&#xff1a;ConfigureNamesBool 初始化參數 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加載參數整體流程 我們先看下guc參數是如何管理的。…

VUE3 學習筆記(6):data數據的監聽、表單綁定、操作DOM

data數據的監聽&#xff08;偵聽&#xff09; 對于data的值的監聽&#xff0c;可以用watch中與data中的參數命名一致的值做為函數進行獲取監聽變動前后的值再做邏輯判斷&#xff0c;如下圖所示。 示例代碼 <template><div><p :class"classDemo">{…