日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 723. 粉碎糖果(模拟)

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 723. 粉碎糖果(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

這個問題是實現一個簡單的消除算法。

給定一個二維整數數組 board 代表糖果所在的方格,不同的正整數 board[i][j] 代表不同種類的糖果,如果 board[i][j] = 0 代表 (i, j) 這個位置是空的
給定的方格是玩家移動后的游戲狀態,現在需要你根據以下規則粉碎糖果,使得整個方格處于穩定狀態并最終輸出。

如果有三個及以上水平或者垂直相連的同種糖果,同一時間將它們粉碎,即將這些位置變成空的。
在同時粉碎掉這些糖果之后,如果有一個空的位置上方還有糖果,那么上方的糖果就會下落直到碰到下方的糖果或者底部,這些糖果都是同時下落,也不會有新的糖果從頂部出現并落下來。
通過前兩步的操作,可能又會出現可以粉碎的糖果,請繼續重復前面的操作。
當不存在可以粉碎的糖果,也就是狀態穩定之后,請輸出最終的狀態。
你需要模擬上述規則并使整個方格達到穩定狀態,并輸出。

樣例 : 輸入: board = [[110,5,112,113,114], [210,211,5,213,214], [310,311,3,313,314], [410,411,412,5,414], [5,1,512,3,3], [610,4,1,613,614], [710,1,2,713,714], [810,1,2,1,1], [1,1,2,2,2], [4,1,4,4,1014]] 輸出: [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0], [110,0,0,0,114],[210,0,0,0,214], [310,0,0,113,314],[410,0,0,213,414], [610,211,112,313,614],[710,311,412,613,714], [810,411,512,713,1014]]

解釋:

注釋 : board 數組的行數區間是 [3, 50]。 board[i] 數組的長度區間(即 board 數組的列數區間)是 [3, 50]。 每個 board[i][j] 初始整數范圍是 [1, 2000]

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/candy-crush
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 把連續三個不為0的標記為負數,待刪除,橫向和縱向都要掃描
  • 把標記為負數的置為0
  • 按縱向掃描,填補下方的空白,雙指針法
  • 遞歸處理,如果沒有需要操作的,達到穩態,返回不再遞歸
class Solution { public:vector<vector<int>> candyCrush(vector<vector<int>>& b) {bool todo = false;int m = b.size(), n = b[0].size(), i, j, up, down;for(i = 0; i < m; ++i)//橫向檢查for(j = 0; j < n-2; ++j){if(b[i][j] == 0)continue;if(abs(b[i][j])==abs(b[i][j+1]) && abs(b[i][j+1])==abs(b[i][j+2])){b[i][j] = b[i][j+1] = b[i][j+2] = -abs(b[i][j]);//標記為負的todo = true;}}for(j = 0; j < n; ++j)//縱向檢查for(i = 0; i < m-2; ++i){if(b[i][j] == 0)continue;if(abs(b[i][j])==abs(b[i+1][j]) && abs(b[i+1][j])==abs(b[i+2][j])){b[i][j] = b[i+1][j] = b[i+2][j] = -abs(b[i][j]);//標記為負的todo = true;}}for(i = 0; i < m; ++i)//負的 標記為0要刪除for(j = 0; j < n; ++j)if(b[i][j] < 0)b[i][j] = 0;for(j = 0; j < n; ++j)//縱向掉落{down = up = m-1;//從最底下開始往上找while(down >= 0){ //雙指針搬移數據if(b[down][j] == 0)//底下待填{up = min(down, up);//up記住上次的位置while(up >= 0 && b[up][j] == 0)up--;if(up >= 0)//上面找到糖果swap(b[down][j], b[up][j]);//交換elsebreak;//找完了}down--;}}if(todo)candyCrush(b);return b;} };

24 ms 10.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 723. 粉碎糖果(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。