藍橋杯 之 暴力回溯

文章目錄

  • 數字接龍
  • 小u的最大連續移動次數問題
  • 迷宮

  • 在藍橋杯中,十分喜歡考察對于網格的回溯的問題,對于這類的問題,常常會使用到這個DFSBFS進行考察,不過無論怎么考察,都只是會在最基礎的模本的基礎上,根據這個題目的條件:
    • 增加遞歸傳遞的參數
    • 增加條件轉移的時候的條件的判斷
    • 考察對于終止狀態的設置,答案的存儲與更新

數字接龍

數字接龍

在這里插入圖片描述
在這里插入圖片描述

  • 查看數據范圍,適合直接進行暴露的DFS搜索
  • 題目的條件有點多,我們逐一進行分析:
    • 需要記錄哪些信息?
      • 當前位置的數字,當前的坐標,當前訪問過的方格的數目
      • 為了保證每一個格子只能訪問過一次,所以得使用visited數組
      • 移動的方向的,得使用一個二維數組step來記錄,得逐一步伐的順序與對應的方位順序是一致的
      • 對于答案的記錄,考慮使用這個字符來記錄,最后再合并就好了
      • 對于交叉的判斷的綜合考慮?

代碼版本1,不考慮這個交叉的問題

import os
import sys# sys.setrecursionlimit(10 ** 6)
# 請在此輸入您的代碼N,K = map(int,input().split())
e = []
# 存儲圖
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 狀態轉移的路徑,左,右,上,下,左上角,右上角,左下角,右下角
# 轉移還得按照這個順序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]# 開始深度搜索,每一步的時候,判斷下面是否是0,還是i+1,還得判斷是否都走過了每一個位置
def dfs(i,x,y,cursum):# 終止狀態if x == N-1 and y == N-1 and cursum == N*N:ans.append(int(''.join(path)))# 如何轉移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):# 還是得存儲這個字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)path.pop()visited[nx][ny] = Falsevisited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)
  • 測試樣例的通過的情況:

在這里插入圖片描述
在這里插入圖片描述

增加了對于交叉的判斷


import os
import sys# sys.setrecursionlimit(10 ** 6)
# 請在此輸入您的代碼N,K = map(int,input().split())
e = []
# 存儲圖
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 狀態轉移的路徑,左,右,上,下,左上角,右上角,左下角,右下角
# 轉移還得按照這個順序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]# 開始深度搜索,每一步的時候,判斷下面是否是0,還是i+1,還得判斷是否都走過了每一個位置
def dfs(i,x,y,cursum):# 終止狀態if x == N-1 and y == N-1 and cursum == N*N:ans.append(int(''.join(path)))# 如何轉移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):if j == 1 and 0<= x-1 and y+1 < N:if visited[x][y+1] and visited[x-1][y]:continueif j == 3 and x+1 < N and y+1 < N:if visited[x][y+1] and visited[x+1][y]:continueif j == 5 and x+1 < N and 0<= y-1:if visited[x][y-1] and visited[x+1][y]:continueif j == 7 and 0<= y-1 and 0<= x-1:if visited[x][y-1] and visited[x-1][y]:continue# 還是得存儲這個字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)path.pop()visited[nx][ny] = Falsevisited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)
  • 樣例通過情況

在這里插入圖片描述
在這里插入圖片描述

  • 改進這個交叉判斷,上面的判斷其實是不合理的,因為如果左右兩邊的位置都被訪問過的話,并不確定對應的對角線是存在線的,正確的做法就是使用多一個數組記錄當前位置的下一步是什么,如果左右位置存在對角線,那么就不能通過

import os
import sys# sys.setrecursionlimit(10 ** 6)
# 請在此輸入您的代碼N,K = map(int,input().split())
e = []
# 存儲圖
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 狀態轉移的路徑,左,右,上,下,左上角,右上角,左下角,右下角
# 轉移還得按照這個順序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]
nextstep = [[-1]*N for _ in range(N)]# 開始深度搜索,每一步的時候,判斷下面是否是0,還是i+1,還得判斷是否都走過了每一個位置
def dfs(i,x,y,cursum):# 終止狀態if x == N-1 and y == N-1 and cursum == N*N:if not ans:ans.append(int(''.join(path)))return # 如何轉移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):if j == 1 and (nextstep[nx][ny-1] == 3 or nextstep[nx-1][ny] == 7): continueif j == 3 and (nextstep[nx-1][ny] == 5 or nextstep[nx][ny-1] == 1): continueif j == 5 and (nextstep[nx-1][ny] == 3 or nextstep[nx][ny+1] == 7): continueif j == 7 and (nextstep[nx+1][ny] == 1 or nextstep[nx][ny+1] == 5): continuenextstep[x][y] = j# 還是得存儲這個字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)if ans:return path.pop()visited[nx][ny] = Falsenextstep[x][y] = -1visited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)

小u的最大連續移動次數問題

小u的最大連續移動次數問題

在這里插入圖片描述

  • 直接暴力進行求解
  • 這個問題的難點在于這個沒有明確的終止狀態,所以考慮使用一個全局的變量進行動態的更新,直接都不返回值
  • 需要記錄的信息:
    • 當前的位置x,y,當前的步數step,上一個狀態是上坡還是下坡flag
def solution(m: int, n: int, a: list) -> int:# 先寫一個dfs模版,后面再每一個點都進行調用sstep = [[0,-1],[0,1],[-1,0],[1,0]]visited = [[False]*n for _ in range(m)]ans = 0# 還得增加一個變量記錄上次是上坡還是下坡,flag = 1表示上,-1表示下def dfs(x,y,step,flag):nonlocal ansans = max(ans,step)for s in sstep:nx,ny = x+s[0],y+s[1]if 0<= nx < m and 0<= ny < n and not visited[nx][ny]:if flag == -1 and a[nx][ny] > a[x][y]:visited[nx][ny] = Truedfs(nx,ny,step+1,1)visited[nx][ny] = Falseif flag == 1 and a[nx][ny] < a[x][y]:visited[nx][ny] = Truedfs(nx,ny,step+1,-1)visited[nx][ny] = Falseans = 0for i in range(m):for j in range(n):visited[i][j] = Truedfs(i,j,0,1)dfs(i,j,0,-1)visited[i][j] = Falsereturn ans

迷宮

迷宮

在這里插入圖片描述

在這里插入圖片描述

  • 求解的是最短距離的問題,所以首先得想到使用這個BFS進行求解
  • 由于求解的是隨機起點到終點的距離,所以我們直接逆向思考,直接從終點進行遍歷,當棧為空的時候,就說明已經遍歷完全部的位置了

from collections import deque, defaultdictn, m = map(int, input().split())
change = defaultdict(list)
for _ in range(m):x1, y1, x2, y2 = map(int, input().split())x1, y1, x2, y2 = x1 - 1, y1 - 1, x2 - 1, y2 - 1change[(x1, y1)].append((x2, y2))change[(x2, y2)].append((x1, y1))def bfs(start, end):queue = deque([(start, end)])visited = [[-1] * n for _ in range(n)]  # 使用二維數組記錄步數,初始值為 -1visited[start][end] = 0step = [[0, -1], [0, 1], [-1, 0], [1, 0]]while queue:s, e = queue.popleft()# 訪問鄰居for dx, dy in step:nx, ny = s + dx, e + dyif 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == -1:visited[nx][ny] = visited[s][e] + 1queue.append((nx, ny))# 走傳送門if (s, e) in change:for nx, ny in change[(s, e)]:if visited[nx][ny] == -1:visited[nx][ny] = visited[s][e] + 1queue.append((nx, ny))# 計算平均步數total = 0for x in range(n):for y in range(n):total += visited[x][y]return total / (n * n)print(f"{bfs(n - 1, n - 1):.2f}")

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

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

相關文章

微信小程序的業務域名配置(通過ingress網關的注解)

一、背景 微信小程序的業務域名配置&#xff08;通過kong網關的pre-function配置&#xff09;是依靠kong實現&#xff0c;本文將通過ingress網關實現。 而我們的服務是部署于阿里云K8S容器&#xff0c;當然內核與ingress無異。 找到k8s–>網絡–>路由 二、ingress注解 …

Python數據可視化工具:六西格瑪及其基礎工具概覽

在當今數據驅動的時代&#xff0c;數據分析和可視化工具成為了各行業優化流程、提升質量的關鍵手段。六西格瑪&#xff08;Six Sigma&#xff09;作為一種以數據為基礎、追求完美質量的管理理念&#xff0c;其實施依賴于一系列基礎工具的靈活運用。而Python&#xff0c;憑借其強…

集群環境下Redis 商品庫存系統設計

目錄 環境實現基本結構代碼業務代碼主體庫存管理模塊 后續問題高并發臨界值與樂觀鎖問題 完整代碼總結后話 環境 我們現在要做商品秒殺系統。功能很簡單&#xff0c;就是庫存刪減。用戶先下單減庫存&#xff0c;之后再進行扣款。 實現 基本結構代碼 那么我們先看下如何搭建…

Spring MVC響應數據

handler方法分析 /*** TODO: 一個controller的方法是控制層的一個處理器,我們稱為handler* TODO: handler需要使用RequestMapping/GetMapping系列,聲明路徑,在HandlerMapping中注冊,供DS查找!* TODO: handler作用總結:* 1.接收請求參數(param,json,pathVariable,共享域等…

基于圖像識別的醫學影像大數據診斷系統的設計與實現

標題:基于圖像識別的醫學影像大數據診斷系統的設計與實現 內容:1.摘要 隨著醫學影像技術的快速發展&#xff0c;醫學影像數據量呈爆炸式增長&#xff0c;傳統的人工診斷方式在處理海量數據時效率低下且容易出現誤差。本研究的目的是設計并實現一個基于圖像識別的醫學影像大數據…

Python散點圖(Scatter Plot):數據探索的“第一張圖表”

在數據可視化領域,散點圖是一種強大而靈活的工具,它能夠幫助我們直觀地理解和探索數據集中變量之間的關系。本文將深入探討散點圖的核心原理、應用場景以及如何使用Python進行高效繪制。 后續幾篇將介紹高級技巧、復雜應用場景。 Python散點圖(Scatter Plot):高階分析、散點…

【redis】在 Spring中操作 Redis

文章目錄 基礎設置依賴StringRedisTemplate庫的封裝 運行StringList刪庫 SetHashZset 基礎設置 依賴 需要選擇這個依賴 StringRedisTemplate // 后續 redis 測試的各種方法&#xff0c;都通過這個 Controller 提供的 http 接口來觸發 RestController public class MyC…

微服務》》Kubernetes (K8S) 集群 安裝

關閉交換空間 # 切換 超級管理員身份 # 查看交換空間 free -h # 關閉交換空間 swapoff -a避免開啟啟動交換空間 # 注釋swap開頭的行 vim /etc/fstab關閉防火墻 # 關閉防火墻 # 因為K8S 是集群形式存在的 至少三臺 一主二從 &#xff08;一個master 兩個node&#xff09…

HTTP和RPC的區別

RPC和 HTTP是兩種常見的通信方式&#xff0c;它們在設計目標、使用場景和技術實現上有顯著區別。以下是它們的詳細對比&#xff1a; 1. 定義與核心思想 特性RPCHTTPRemote Procedure Call遠程過程調用HyperText Transfer Protocol超文本傳輸協議定義一種協議或框架&#xff0…

MySQL 簡記

MySQL 簡記 mysql中的數據存儲的結構是B樹 其與B樹的相同點是&#xff0c;B樹一個節點也可以存放多條數據&#xff0c;并且從左到右依次增大&#xff1b;不同點是&#xff0c;B樹的葉子結點之間也能相互連接。那么實際上是采取利用空間換區時間的策略。 那么B樹的樹結構like…

十七、實戰開發 uni-app x 項目(仿京東)- 后端指南

前面我們已經用uniappx進行了前端實戰學習 一、實戰 開發uni-app x項目(仿京東)-規劃-CSDN博客 二、實戰 開發uni-app x項目(仿京東)-項目搭建-CSDN博客 三、實戰開發 uni-app x 項目(仿京東)- 技術選型-CSDN博客 四、實戰開發 uni-app x 項目(仿京東)- 頁面設計-C…

Infura 簡介

文章目錄 Infura 簡介Infura 的主要功能Infura 的替代方案&#xff08;類似服務&#xff09;AlchemyQuickNodeAnkrMoralisPocket Network 什么時候選擇 Infura&#xff1f; Infura 簡介 Infura 是一個 區塊鏈基礎設施即服務&#xff08;BaaS, Blockchain as a Service&#xf…

TouchSocket TcpService:構建高性能Tcp服務的終極利器

這里寫目錄標題 TouchSocket TCPService&#xff1a;構建高性能TCP服務的終極利器引言TCPService核心特性快速入門&#xff1a;5分鐘搭建TCP服務1. 創建基礎TCP服務2. 自定義插件處理數據 高級用法實戰1. 客戶端連接管理 性能與穩定性保障示例與源碼結語 TouchSocket TCPServic…

Android Fresco 框架緩存模塊源碼深度剖析(二)

一、引言 在 Android 應用開發中&#xff0c;圖片加載和處理是常見且重要的功能。頻繁的圖片加載不僅會消耗大量的網絡流量&#xff0c;還會影響應用的性能和響應速度。因此&#xff0c;有效的緩存機制對于提升圖片加載效率和用戶體驗至關重要。Fresco 是 Facebook 開源的一款…

springboot使用163發送自定義html格式的郵件

springboot使用163發送html格式的郵件 效果: 下面直接開始教學 注冊郵箱&#xff0c;生成授權碼 獲取163郵箱的授權碼&#xff0c;可以按照以下步驟操作&#xff1a; 登錄163郵箱 打開瀏覽器&#xff0c;訪問 163郵箱登錄頁面。 使用你的郵箱賬號和密碼登錄。進入郵箱設置 登…

【Kafka】深入了解Kafka

集群的成員關系 Kafka使用Zookeeper維護集群的成員信息。 每一個broker都有一個唯一的標識&#xff0c;這個標識可以在配置文件中指定&#xff0c;也可以自動生成。當broker在啟動時通過創建Zookeeper的臨時節點把自己的ID注冊到Zookeeper中。broker、控制器和其他一些動態系…

C#使用SnsPictureBox.dll繪制點,線段、圓、折線、多邊形、測量尺等多種圖形。

CSDN下載地址&#xff1a;https://download.csdn.net/download/sns1991sns/87726867 gitee下載地址:https://gitee.com/linsns/SnsPictrueBox 支持2種繪制方式&#xff1a;響應式和等待式。 一、使用響應式繪制圖形 1、在窗口構造函數里添加繪制圖形的完成響應函數 public…

Hugging Face預訓練GPT微調ChatGPT(微調入門!新手友好!)

Hugging Face預訓練GPT微調ChatGPT&#xff08;微調入門&#xff01;新手友好&#xff01;&#xff09; 在實戰中&#xff0c;?多數情況下都不需要從0開始訓練模型&#xff0c;?是使?“??”或者其他研究者開源的已經訓練好的?模型。 在各種?模型開源庫中&#xff0c;最…

Redis BitMap 用戶簽到

Redis Bitmap Bitmap&#xff08;位圖&#xff09;是 Redis 提供的一種用于處理二進制位&#xff08;bit&#xff09;的特殊數據結構&#xff0c;它基于 String 類型&#xff0c;每個 bit 代表一個布爾值&#xff08;0 或 1&#xff09;&#xff0c;可以用于存儲大規模的二值狀…

Spring Boot 3 新特性實戰:從理論到實踐

引言 Spring Boot 自發布以來&#xff0c;憑借其簡潔的配置和強大的功能&#xff0c;迅速成為 Java 開發者的首選框架。隨著 Spring Boot 3 的發布&#xff0c;開發者們迎來了更多令人興奮的新特性。本文將深入探討 Spring Boot 3 的新特性&#xff0c;并通過實戰示例展示如何…