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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离)

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

在一個 2 x 3 的板上(board)有 5 塊磚瓦,用數字 1~5 來表示, 以及一塊空缺用 0 來表示.

一次移動定義為選擇 0 與一個相鄰的數字(上下左右)進行交換.

最終當板 board 的結果是 [[1,2,3],[4,5,0]] 謎板被解開。

給出一個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,則返回 -1 。

示例: 輸入:board = [[1,2,3],[4,0,5]] 輸出:1 解釋:交換 051 步完成輸入:board = [[1,2,3],[5,4,0]] 輸出:-1 解釋:沒有辦法完成謎板輸入:board = [[4,1,2],[5,0,3]] 輸出:5 解釋: 最少完成謎板的最少移動次數是 5 , 一種移動路徑: 尚未移動: [[4,1,2],[5,0,3]] 移動 1: [[4,1,2],[0,5,3]] 移動 2: [[0,1,2],[4,5,3]] 移動 3: [[1,0,2],[4,5,3]] 移動 4: [[1,2,0],[4,5,3]] 移動 5: [[1,2,3],[4,5,0]]輸入:board = [[3,2,4],[1,5,0]] 輸出:14提示: board 是一個如上所述的 2 x 3 的數組. board[i][j] 是一個 [0, 1, 2, 3, 4, 5] 的排列.

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

2. BFS解題


類似于上圖的拼圖游戲,問到達某一狀態的最小移動步數。

類似題目:LeetCode 1284. 轉化為全零矩陣的最少反轉次數(BFS & 矩陣狀態編碼解碼)

  • BFS,隊列push地圖的初始狀態
  • 將隊列里的狀態取出,還原地圖,按著幾個方向移動0,生成的新的狀態,push進隊列
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m, n, i, j, k, step = 0, size, x, y; public:int slidingPuzzle(vector<vector<int>>& board) {m = board.size(), n = board[0].size();string ans = "123450", state;int x0, y0, xi, yi;pair<int,int> xy0;//0的坐標queue<string> q;unordered_set<string> visited;//訪問標記集合state = boardToString(board);//初始狀態if(state == ans)return step;q.push(state);visited.insert(state);while(!q.empty()){step++;size = q.size();while(size--){xy0 = stringToBoard(q.front(), board);//還原地圖,并得到0的坐標q.pop();x0 = xy0.first;y0 = xy0.second;for(k = 0; k < 4; ++k){ //0可以4個方向交換xi = x0+dir[k][0];yi = y0+dir[k][1];if(xi>=0 && xi<m && yi>=0 && yi<n){swap(board[xi][yi], board[x0][y0]);//交換state = boardToString(board);//新的狀態if(state == ans)return step;if(!visited.count(state))//沒有出現過該地圖{visited.insert(state);q.push(state);}swap(board[xi][yi], board[x0][y0]);//還原現場}}}}return -1;}string boardToString(vector<vector<int>>& board) { //地圖轉成字符串string s;for (i = 0; i < m; i++)for(j = 0; j < n; j++)s.push_back(board[i][j]+'0');return s;}pair<int,int> stringToBoard(string &s, vector<vector<int>>& board){ //字符串還原成地圖,并return 0的坐標,方便下次挪動for (i = m-1; i >= 0; i--)for(j = n-1; j >= 0; j--){board[i][j] = s.back()-'0';s.pop_back();if(board[i][j] == 0)x = i, y = j;}return make_pair(x, y);} };

總結

以上是生活随笔為你收集整理的LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离)的全部內容,希望文章能夠幫你解決所遇到的問題。

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