【C++刷題】優選算法——遞歸第三輯

floodfill篇

  1. 圖像渲染
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<int>>& image, int sr, int sc, int color, int val)
{image[sr][sc] = color;for(auto& e : direction){int x = sr + e.first, y = sc + e.second;if((x >= 0 && x < image.size())&& (y >= 0 && y < image[0].size())&& (image[x][y] == val)){dfs(image, x, y, color, val);}}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
{if(color == image[sr][sc]) return image;dfs(image, sr, sc, color, image[sr][sc]);return image;
}
  1. 島嶼數量
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visit, int i, int j)
{visit[i][j] = true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < grid.size())&& (y >= 0 && y < grid[0].size())&& (grid[x][y] == '1')&& (visit[x][y] == false)){dfs(grid, visit, x, y);}}
}
int numIslands(vector<vector<char>>& grid)
{vector<vector<bool>> visit(grid.size(), vector<bool>(grid[0].size()));int ret = 0;for(int i = 0; i < grid.size(); ++i){for(int j = 0; j < grid[0].size(); ++j){if(grid[i][j] == '1' && visit[i][j] == false){ret += 1;dfs(grid, visit, i, j);}}}return ret;
}
  1. 島嶼的最大面積
int area = 0;
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, int i, int j)
{++area;visit[i][j] = true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < grid.size())&& (y >= 0 && y < grid[0].size())&& (grid[x][y] == 1)&& (visit[x][y] == false)){dfs(grid, visit, x, y);}}
}
int maxAreaOfIsland(vector<vector<int>>& grid)
{vector<vector<bool>> visit(grid.size(), vector<bool>(grid[0].size()));int ret = 0;for(int i = 0; i < grid.size(); ++i){for(int j = 0; j < grid[0].size(); ++j){if(grid[i][j] == 1 && visit[i][j] == false){dfs(grid, visit, i, j);if(area > ret) ret = area;area = 0;}}}return ret;
}
  1. 被圍繞的區域
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<char>>& board, vector<vector<bool>>& visit, int i, int j)
{visit[i][j] = true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < board.size())&& (y >= 0 && y < board[0].size())&& (board[x][y] == 'O')&& (visit[x][y] == false)){dfs(board, visit, x, y);}}
}
void solve(vector<vector<char>>& board)
{vector<vector<bool>> visit(board.size(), vector<bool>(board[0].size(), false));// 第一行 i=0for(int j = 0; j < board[0].size(); ++j){if(board[0][j] == 'O' && visit[0][j] == false){dfs(board, visit, 0, j);}}// 最后一行 i=board.size()-1for(int j = 0; j < board[0].size(); ++j){if(board[board.size()-1][j] == 'O' && visit[board.size()-1][j] == false){dfs(board, visit, board.size() - 1, j);}}// 第一列 j=0for(int i = 1; i < board.size() - 1; ++i){if(board[i][0] == 'O' && visit[i][0] == false){dfs(board, visit, i, 0);}}// 最后一列 j=board[0].size() - 1for(int i = 1; i < board.size() - 1; ++i){if(board[i][board[0].size() - 1] == 'O' && visit[i][board[0].size() - 1] == false){dfs(board, visit, i, board[0].size() - 1);}}for(int i = 0; i < board.size(); ++i){for(int j = 0; j < board[0].size(); ++j){if(board[i][j] == 'O' && visit[i][j] == false){board[i][j] = 'X';}}}
}
  1. 太平洋大西洋水流問題
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
int m, n;
void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visit, int i , int j)
{visit[i][j] = true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < m)&& (y >= 0 && y < n)&& (heights[i][j] <= heights[x][y])&& (visit[x][y] == false)){dfs(heights, visit, x, y);}}
}
vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights)
{m = heights.size();n = heights[0].size();vector<vector<bool>> visit1(m, vector<bool>(n, false));vector<vector<bool>> visit2(m, vector<bool>(n, false));// 第一行 i=0for(int j = 0; j < n; ++j){if(visit1[0][j] == false){dfs(heights, visit1, 0, j);}}// 第一列 j=0for(int i = 0; i < m; ++i){if(visit1[i][0] == false){dfs(heights, visit1, i, 0);}}// 最后一行 i=m-1for(int j = 0; j < n; ++j){if(visit2[m-1][j] == false){dfs(heights, visit2, m-1, j);}}// 最后一列 j=n-1for(int i = 0; i < m; ++i){if(visit2[i][n-1] == false){dfs(heights, visit2, i, n-1);}}vector<vector<int>> ret;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(visit1[i][j] && visit2[i][j]){ret.push_back({i, j});}}}return ret;
}
  1. 掃雷游戲
unordered_multimap<int, int> direction = {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}
};
void dfs(vector<vector<char>>& board, int i, int j)
{char ch = '0';for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < board.size())&& (y >= 0 && y < board[0].size())&& (board[x][y] == 'M'))++ch;}if(ch > '0') {board[i][j] = ch;return;}board[i][j] = 'B';for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < board.size())&& (y >= 0 && y < board[0].size())&& (board[x][y] == 'E'))dfs(board, x, y);}
}
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
{int r = click[0], c = click[1];if(board[r][c] != 'M' && board[r][c] != 'E') return board;if(board[r][c] == 'M'){board[r][c] = 'X';return board;}// board[r][c]是未挖出的的空方塊 - 'E'dfs(board, r, c);return board;
}
  1. 衣櫥整理
int ret = 0;
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{1, -1}
};
int digit(int x)
{int sum = 0;while(x){sum += (x % 10);x /= 10;}return sum;
}
void dfs(vector<vector<bool>>& visit, int i, int j, int cnt)
{++ret;visit[i][j] = true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < visit.size())&& (y >= 0 && y < visit[0].size())&& (visit[x][y] == false)&& ((digit(x) + digit(y) <= cnt))){dfs(visit, x, y, cnt);}}
}
int wardrobeFinishing(int m, int n, int cnt)
{vector<vector<bool>> visit(m, vector<bool>(n, false));dfs(visit, 0, 0, cnt);return ret;
}

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

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

相關文章

關于微服務的一點感悟和過往經驗的思考

一、為什么有微服務 解決單體應用的局限性 隨著業務發展&#xff0c;業務邏輯復雜、關聯方多&#xff0c;導致業務系統的代碼臃腫、難于做迭代或者維護&#xff0c;導致很多的問題&#xff0c;如&#xff1a;bug多、難于維護修復、每次需要評估改動服務接口影響的范圍&#xf…

碰撞器觸發事件(OnTriggerEnter/OnTriggerStay/OnTriggerExit)

碰撞器觸發事件&#xff08;OnTriggerEnter/OnTriggerStay/OnTriggerExit&#xff09;簡介 在Unity中&#xff0c;觸發器事件是當一個游戲對象進入、停留或離開另一個游戲對象的觸發器碰撞器時發生的事件。這些事件分別是: OnTriggerEnter: 當其他Collider首次進入觸發器時調用…

服務端Web資源緩存

1.前言 雖然客戶端緩存效果很好&#xff0c;但它有一個核心問題&#xff1a;要在本地提供資源&#xff0c;必須先將其存儲在緩存中。因此&#xff0c;每個客戶端都需要其緩存的資源。如果請求的資源需要大量計算&#xff0c;則無法擴展。服務器端緩存背后的理念是計算一次資源…

【CAN】libsocketcan庫詳解

1、簡介 libsocketcan是用戶空間通過SocketCAN操作CAN的接口。 源碼:https://github.com/linux-can/libsocketcan 2、API詳解 2.1 can_do_restart 1)說明:重啟CAN接口 2)原型: int can_do_restart(const char *name);3)參數: name:CAN接口名,比如:can0、can1,…

繼續分析開發人員容易被騙的原因和防范措施

繼續分析開發人員容易被騙的原因和防范措施&#xff0c;可以深入探討一些具體的技術細節和實際操作建議&#xff0c;以更全面地理解和應對這一問題。 技術細節&#xff1a; 未加密的敏感數據傳輸&#xff1a; 原因&#xff1a;開發人員可能忽視了數據傳輸過程中的安全性&#…

第10章 軟件架構的演化和維護

軟件架構周期&#xff1a;初始設計、實際使用、修改完善(這就是演化)、退化棄用。 演化和維護的目的&#xff1a;為了使軟件能夠適應環境的變化而進行的糾錯性修改和完善性修改等&#xff0c;而且這個過程是一個不斷迭代的過程。 架構演化的重要性、演化過程、演化分類、演化…

Vary HTTP 標頭

1.前言 服務器端 Web 資源緩存的想法是在客戶端和上游之間設置一個組件來緩存先前計算的結果&#xff0c;以避免后者過載。根據您的基礎架構和要求&#xff0c;此組件可以是反向代理或 API 網關。HTTP 提供Cache-Control標頭來自定義緩存的不同方面&#xff0c;例如&#xff0…

Java——通過方法交換實參值

想寫一個方法來交換main函數中的兩個變量值&#xff0c;代碼如下&#xff1a; public class Test {public static void swap(int x,int y) {int tmp x;x y;y tmp;}public static void main(String[] args) {int a 10;int b 20;System.out.println("交換前&#xff1…

Autodesk Maya 2025軟件安裝教程(附軟件下載地址)

軟件簡介&#xff1a; 軟件【下載地址】獲取方式見文末。注&#xff1a;推薦使用&#xff0c;更貼合此安裝方法&#xff01; Autodesk Maya 2025是一款領先的三維動畫設計軟件&#xff0c;界面直觀且功能豐富。它集成了全球領先的3D設計技術&#xff0c;提供了多種創意功能&a…

深度學習 --- stanford cs231 編程作業(如何在chrome中安裝colab)

stanford cs231 編程作業(如何開始你的colab編程&#xff09; 斯坦福231n的所有作業都要求在colab里面做&#xff0c;colab可以為你提供免費的云計算。實際上在他的官網中也有關于如何安裝colab的詳細說明視頻。 https://youtu.be/DsGd2e9JNH4https://youtu.be/DsGd2e9JNH4 我…

2831.找出最長等值子數組(哈希表+滑動窗口法)

給你一個下標從 0 開始的整數數組 nums 和一個整數 k 。 如果子數組中所有元素都相等&#xff0c;則認為子數組是一個 等值子數組 。注意&#xff0c;空數組是 等值子數組 。 從 nums 中刪除最多 k 個元素后&#xff0c;返回可能的最長等值子數組的長度。 子數組 是數組中一個連…

電路筆記 :元器件焊接相關 酒精燈松香浴加熱取芯片

記錄一下只使用松香和小火源加熱&#xff08;如酒精燈、小蠟燭&#xff09;從電路板中取芯片。 過程 多放松香 讓松香淹沒芯片盡量均勻加熱&#xff0c;等芯片旁邊的松香開始從芯片里冒細小的“泡泡”&#xff0c;就差不多了 注&#xff1a;這種方法也可以用于焊接&#xff0…

Qt QString詳細用法

一.基礎用法 1.創建QString對象 QString str1 "Hello, World!"; QString str2("This is a QString object."); //一個是等號的重載&#xff0c;一個是拷貝構造&#xff0c;本質上是等價的 2.獲取字符串長度 int length str1.length(); // 返回字符串…

大模型落地競逐,云計算大廠“百舸爭流”

作者 | 辰紋 來源 | 洞見新研社 從ChatGPT到Sora&#xff0c;從圖文到視頻&#xff0c;從通用大模型到垂直大模型……經過了1年多時間的探索&#xff0c;大模型進入到以落地為先的第二階段。 行業的躁動與資本的狂熱相交匯&#xff0c;既造就了信仰派的腳踏實地&#xff0c;也…

7.從0做一個vue鍵盤組件

文章目錄 1. 從0做一個鍵盤組件1.1. 最終效果1.2. 分析1.3. 實現1.4. 如何引用 1. 從0做一個鍵盤組件 首先是why的問題&#xff1a;為什么需要做鍵盤組件&#xff1f; 我們目前可知的場景&#xff1a; 在新增賬單的時候&#xff0c;需要用到鍵盤在比如從賬單列表頁&#xff…

保護共享資源的方法(互斥鎖)

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

MagicAnimate: Temporally Consistent Human Image Animation using Diffusion Model

show lab NUS&bytedancehttps://github.com/magic-research/magic-animate 問題引入 輸入參考圖片 I r e f I_{ref} Iref?和動作序列 p 1 : N [ p 1 , ? , p N ] p^{1:N}[p_1,\cdots,p_N] p1:N[p1?,?,pN?]&#xff0c;其中 N N N表示的是幀數&#xff0c;輸出的是 …

探索iOS中的KVC

目錄 前言 1.iOS中的KVC&#xff08;鍵值編碼&#xff09; 1. 什么是KVC&#xff1f; 2. 使用KVC 1.設置屬性值 2.獲取屬性值 3. KVC的高級用法 1.訪問私有屬性 2.訪問集合屬性 4. KVC的安全性 5. KVC原理 1. 查找順序 2. 設置值 6.參考文章 前言 這篇文章主要是…

UbuntuLinux系統下安裝wrk和使用

前言 wrk是一個用c語言寫的壓力測試工具&#xff0c;非常有用&#xff0c;但是ubuntu的軟件倉庫沒有收錄wrk&#xff0c;需要我們自己進行編譯和安裝&#xff0c;最近在學習一些性能測試、性能優化方面的知識&#xff0c;需要使用到這個強有力的工具&#xff0c;故此記錄安裝和…

Windows安全應急--在應急響應中需要知道的信息

在網絡安全事件發生后&#xff0c;一般是要去客戶現場排查問題的&#xff0c; 那么要想解決問題&#xff0c;信息的完整性決定了這次任務的成敗。。 1. 你需要知道的&#xff1a; 先讓客戶梳理一遍事情的起因經過結果 詢問客戶需要解決的問題 了解客戶的網絡環境&#xff08…