藍橋杯_染色_bfs_Java

????????臨時抱抱佛腳,太浮躁了,藍橋杯已經快1個半月沒做題了。

????????本人比較菜,感覺這個時間節點也只能把暴力題給盡量多做做,找找做題手感,其他就純憑運氣了吧。T-T。

題目

問題描述

小藍有一個 n 行 m 列的白色棋盤, 棋盤的每一個方格都可以被染成彩色。

每個方格有一個染色時間 tij, 不同方格的染色時間可能不同。如果一個方 格被觸發了染色, 這個方格就會在 tij秒之后變成彩色, 然后將自己上下左右四 個方向相鄰的方格觸發染色。每個方格只能被觸發染色一次, 第一次觸發之后 的觸發為無效觸發。

給定每個方格的染色時間, 在時刻 0 觸發第一行第一列的方格染色, 請問 多長時間后整個棋盤完成染色。

輸入格式

輸入的第一行包含兩個整數 n,m,分別表示棋盤的行數和列數。

接下來 n 行, 每行 m 個正整數, 相鄰的整數之間用一個空格分隔, 表示每個方格的染色時間。該部分的第 i 行第 j 個整數表示 tij?, 即第 i 行第 j 列的方 格的染色時間。

輸出格式

輸出一行包含一個整數, 表示整個棋盤完成染色的時間。

樣例輸入

2 3
1 2 3
4 5 6

樣例輸出

12

評測用例規模與約定

對于 30 的評測用例, 1≤n,m≤10。

對于 60 的評測用例, 1≤n,m≤50 。

對于所有評測用例, 1≤n,m≤500,1≤tij≤1000。

運行限制

  • 最大運行時間:1s
  • 最大運行內存: 256M

題意

????????就是他有一個n*m的棋盤,然后每個方格都可以被染色,但是只有到了那個染色時間,這個方格才能觸發染色。從他剛被觸發,到染色完成變成彩色,需要tij的時間。讓你求,n*m個格子全都染色完成時的時間是多少。

思路

????????這題會很容易想到是BFS,就是從最先變成彩色的點開始向外擴展,每次更新時間就可以。我們先來看一下代碼。

? ? ? ? 代碼主要用到優先隊列,因為我們需要讓染色時間最短的先出隊列。

? ? ? ? 這里是菜鳥踩坑的地方(踩的第一個坑):

????????????????但是我最開始并沒有用優先隊列,我是直接先對list按照tij從小到大排序,然后在bfs里用的普通隊列,我自認為bfs()中的普通隊列也是按照tij從小到大排好的。不知道你們有沒有這種想法。這種想法是肯定不可以的啊。原因如下,因為按下面這份代碼來說,如果你直接在main方法里將list按照tij排序,你只能保證第一個進入普通隊列的tij值一定是最小的,但是后續的你無法保證。

????????為什么呢?

? ? ? ? 因為當你第一次進入while的時候,肯定tij最小的那個已經進入隊列了,然后你就要開始四個方向的遍歷,但是你無法保證(tx,ty)上的tij一定是第二小的,對吧。而且我們上下左右定義的順序都不一樣,更何況說一定能保證tij從小到大進隊列。所以普通隊列不可行,必須在bfs()里用優先隊列,讓每一次出隊的都是隊列中tij最小的。

? ? ? ? 這里是菜鳥難以跨越的第二個坑T/\T:

????????? ? ? ? 就是題目既然問你最終n*m個格子染色完成的時間了,所以bfs()中肯定要有一個變量記錄一下這個結果吧,那么怎么記錄呢?本菜鳥就卡這了。

????????? ? ? ? 最開始我寫的代碼特離譜,static里定義了一個ans,bfs()里定義了res,又是比較大小啥的。。。

????????? ? ? ? 其實就在bfs()里用一個變量持續更新就行了,下面代碼里用的是res。下面講一下更新res的邏輯:while外我定義res的初始值為0,當第一次進入while循環時,直接讓res = poll[2]即可。就該題而言,第一次進入while時,res = poll[2] = 1。為什么讓res=poll[2],而不是用max去取res和poll[2]的最大值,我們后面會說。

????????? ? ? ? 之后我們進行四個方向的嘗試,如果更新后的格子坐標不越界并且未被訪問過,我們就將其坐標以及更新后的tij加到隊列中,并將vis設為true。

為什么要在這個地方更新tij???

先看下邊的圖,輔助我們理解。

????????上邊的(0,1,3)入隊啥的,(0,1)是格子索引,3是更新完的時間。

還是這個問題:為什么要在這個地方更新tij???

? ? ? ? 就是不知道能不能get到這個點,就是你在queue.offer里更新時間的話,是有一個向后性的,也就是說你更新的永遠是最新的節點,相當于你在直接的更新結果,即你求的是從起點到終點的累計時間

? ? ? ? 就是不知道有沒有人會這么寫,可能會有點誤導,這就是本菜鳥踩的第三個大坑:

????????? ? ? ? 不在queue.offer里更新時間,直接queue.offer(tx,ty,g[tx][ty]);然后把前邊的res?=?poll[2];改成res += poll[2];這樣肯定是不對的啊。如果你這樣寫的話,那res豈不是表示所有出隊節點時間的總和了嗎,因為直接queue.offer(tx,ty,g[tx][ty]);,所以并沒有更改每個格子的時間。

????????下面來說一下為什么讓res=poll[2],而不是用max去取res和poll[2]的最大值???

? ? ? ? 這個問題也困了我很久,但是你看右上方圖片里寫的文字表述,應該可以發現,收到優先隊列的影響,每次出來的都是tij最短的,所以受他影響的格子的完成染色的時間一定是最早的。為什么?因為你一把他觸發,vis在代碼里就設為true了,后邊出隊的格子沒法影響它已經影響過的格子了。所以每次的poll[2]其實就是當前格子被染色完成的最早的時間點。

? ? ? ? 希望能幫助到大家。雖然文章還有很多不足之處。

代碼

import java.util.*;
public class 染色時間 {static int n;static int m;static int[][]g;static boolean [][]vis;static int [][]f = {{1,0},{-1,0},{0,1},{0,-1}};static List<int []> list;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();g = new int[n][m];list = new ArrayList<>();vis = new boolean[n][m];for(int i = 0;i < n;i ++) {for (int j = 0;j < m;j ++) {g[i][j] = sc.nextInt();list.add(new int[]{i,j,g[i][j]});}}int ans = bfs(list.get(0)[0],list.get(0)[1],list.get(0)[2]);System.out.println(ans);}public static int bfs(int x, int y, int time) {PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->a[2]-b[2]);queue.offer(new int[]{x,y,time});vis[x][y] = true;int res = 0;while (!queue.isEmpty()) {int []poll = queue.poll();res = poll[2];for(int i = 0;i < 4;i ++) {int tx = poll[0] + f[i][0];int ty = poll[1] + f[i][1];if (tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty]) {queue.offer(new int[]{tx,ty,g[tx][ty] + res});vis[tx][ty] = true;}}}return res;}
}

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

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

相關文章

MySQL 究極奧義·動態乾坤大挪移·無敵行列轉換術

導入大SQL文件 [mysqld] # 大批量導入優化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G動態行列轉換 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大廠自動化報表實戰(互聯網金融-數據分析周報制作中)

這是Excel大廠自動化報表實戰第三期--互聯網金融-數據分析周報制作中 數據資源已經與這篇博客捆綁&#xff0c;有需要者可以下載通過網盤分享的文件&#xff1a;2.4自動化報表-8月成交數據.xlsx&#xff0c;2.4自動化報表-8月獲客數據.csv等2個文件 鏈接: https://pan.baidu.c…

langchain從入門到精通(七)——利用回調功能調試鏈應用 - 讓過程更透明

1. Callback 功能介紹 Callback 是 LangChain 提供的回調機制&#xff0c;允許我們在 LLM 應用程序的各個階段使用 hook &#xff08;鉤子&#xff09;。鉤子的含義也非常簡單&#xff0c;我們把應用程序看成一個一個的處理邏輯&#xff0c;從開始到結束&#xff0c;鉤子就是在…

如何使用Postman做接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文適合已經掌握 Postman 基本用法的讀者&#xff0c;即對接口相關概念有一定了解、已經會使用 Postman 進行模擬請求等基本操作。 工作環境與版本&#xff1a; …

ELK日志文件分析系統——E(Elasticsearch)

目錄 基本概念 一、架構設計 二、核心原理 三、關鍵特性 四、應用意義 部署步驟 ?一、環境準備? ?二、安裝 Elasticsearch? ?三、關鍵配置&#xff08;elasticsearch.yml&#xff09;? ?四、啟動與驗證? ?五、集群擴展&#xff08;新增節點&#xff09;? …

融智學教育觀及其數學公式體系凝練匯總

摘要&#xff1a;本文系統闡述了鄒曉輝教授的融智學教育觀&#xff0c;通過原創數學公式體系構建了人機協同教育模型。核心內容包括&#xff1a;認知本體論&#xff08;文明智慧當量方程&#xff09;、方法論&#xff08;七遍通訓練算子&#xff09;、生態位控制論&#xff08;…

互聯網大廠Java求職面試:AI大模型應用實踐中的架構挑戰與實戰

互聯網大廠Java求職面試&#xff1a;AI大模型應用實踐中的架構挑戰與實戰 引言 在當今技術飛速發展的時代&#xff0c;AI大模型已成為企業數字化轉型的重要引擎。無論是內容生成、智能客服、個性化推薦&#xff0c;還是知識圖譜構建和語義理解&#xff0c;大模型的應用場景正在…

龜兔賽跑算法(Floyd‘s Cycle-Finding Algorithm)尋找重復數

龜兔賽跑算法&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;尋找重復數 問題描述 給定一個長度為 N1 的數組 nums&#xff0c;其中每個元素的值都在 [1, N] 范圍內。根據鴿巢原理&#xff0c;至少有一個數字是重復的。請找出這個重復的數字。 要求&#xff1a; …

紫光展銳T8300以創新音頻技術重塑感知世界

數字化時代&#xff0c;從語音通話到智能交互&#xff0c;從聆聽音樂到創作Vlog&#xff0c;聲音已成為隱形的基礎措施。日益發展的音頻技術正在重構用戶感知世界的方式&#xff0c;重塑用戶的聽覺體驗。 T8300是紫光展銳專為全球主流用戶打造的5G SoC&#xff0c;采用了紫光展…

寫作詞匯積累(A):頗有微詞、微妙(“微”字的學習理解)

一、頗有微詞 1、基本介紹 【頗有微詞】指對某人或某事有輕微的批評、不滿或不同意見&#xff0c;但表達得含蓄委婉 【頗】表示程度較深&#xff0c;【微詞】表示隱晦的批評 【微】表示隱晦的、不直白的&#xff0c;強調批評的委婉性 2、使用實例 1、盡管公司的新考勤制度…

flowable工作流的學習demo

1.spring 部署流程 刪除部署 查看歷史信息 加載一個默認的配置文件 里面包含用戶名和數據庫信息 加載自定義的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下載得到一個文件 ┌──(kali?kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali?kali)-[~] └─$ cat misc50 …

【編譯工具】(自動化)AI 賦能的自動化測試工具:如何讓測試效率提升 500% 并實現智能質檢?

#『編程工具』提升效率征文挑戰賽# 目錄 引言&#xff1a;AI 如何重塑自動化測試格局 一、新一代 AI 測試工具核心能力解析 二、實戰演示&#xff1a;Testim 智能測試平臺 &#xff08;1&#xff09;智能錄制測試流程 ① 步驟演示 ② AI 元素定位原理 &#xff08…

毛紀逆向分析

文章目錄 毛紀逆向分析前言知識系統整體架構概述模塊分析模塊0模塊1模塊2模塊3模塊4模塊5總結毛紀逆向分析 對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學(系統理論和實戰教程)、提供接單兼職渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 簡單 C】141. 環形鏈表

目錄 題目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指針 題目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服務注冊與發現原理和使用

1.Eureka 基礎概念 Eureka 是 Netflix 開發的服務注冊與發現組件&#xff0c;是 Spring Cloud 微服務架構中的核心模塊&#xff0c;用于解決微服務間的自動發現與通信問題。其核心功能包括&#xff1a; 服務注冊&#xff1a;服務實例將自身信息&#xff08;IP、端口、健康狀態等…

create_react_agent + MCP tools

文章目錄 MCP tools 調用結果輸出MCP Tool 內容成功返回失敗返回 普通工具調用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 調用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示詞Prompts(1)

摘要&#xff1a; 本文介紹了langchain.prompts中基礎的提示詞模板的用法&#xff0c;包括基礎的文本模板、對話模板、小樣本模板、以及主要兩種樣本選擇器的用法。 文章目錄 1. prompts介紹&#xff1f;2. 提示詞模板體系 Prompt Templates2.1 基礎文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安裝最新版本的 VirtualBox

Elementary OS 是一個基于 Ubuntu Linux 的發行版&#xff0c;它易于使用&#xff0c;對初學者友好&#xff0c;并且在用戶中非常受歡迎。如果你是 Elementary OS 的用戶&#xff0c;并且想在上面虛擬運行和探索其他操作系統&#xff0c;那么 Oracle VirtualBox 是一個非常不錯…

uni-app項目loading顯示方案

前情 uni-app是我比較喜歡的跨平臺框架&#xff0c;它能開發小程序/H5/APP(安卓/iOS)&#xff0c;重要的是對前端開發友好&#xff0c;自帶的IDE可視化的運行和打包也讓開發體驗也非常棒&#xff0c;公司項目就是主推uni-app&#xff0c;為了用戶體驗對于耗時操作&#xff0c;…