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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 773. 滑动谜题

發(fā)布時間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 773. 滑动谜题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

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

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

最終當(dāng)板?board?的結(jié)果是?[[1,2,3],[4,5,0]]?謎板被解開。

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

  • 示例:
輸入:board = [[1,2,3],[4,0,5]] 輸出:1 解釋:交換 0 和 5 ,1 步完成 輸入:board = [[1,2,3],[5,4,0]] 輸出:-1 解釋:沒有辦法完成謎板 輸入:board = [[4,1,2],[5,0,3]] 輸出:5 解釋: 最少完成謎板的最少移動次數(shù)是 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 的數(shù)組.
  • board[i][j]?是一個?[0, 1, 2, 3, 4, 5]?的排列.

解題思路

  • 使用字符串代表謎板的狀態(tài)
  • board = [[1,2,3],[4,0,5]]1 2 3 4 0 5使用字符串 123405表示

    所以每一個字符串就代表謎板的一個狀態(tài)

  • 廣度優(yōu)先搜索
    利用隊(duì)列實(shí)現(xiàn)廣度優(yōu)先搜索,根據(jù)0所在位置,將0和周圍的數(shù)字進(jìn)行交換,從而衍生出若干種情況加入隊(duì)列
  • 代碼

    class Solution {public void swagg(char[] tar,int x,int y) {char temp=tar[x];tar[x]=tar[y];tar[y]=temp;}public int slidingPuzzle(int[][] board) {StringBuilder stringBuilder=new StringBuilder();for (int i=0;i<board.length;i++)for (int j=0;j<board[0].length;j++){stringBuilder.append(board[i][j]);}Set<String> set=new HashSet<>();Queue<String> queue=new LinkedList<>();queue.add(stringBuilder.toString());int res=0;String s=null;while (!queue.isEmpty()){int cur=queue.size();for (int i=0;i<cur;i++){s = queue.poll();if(s.equals("123450")) return res;char[] th=s.toCharArray();for (int j=0;j<6;j++){if(th[j]=='0'){int x=j%3,y=j/3;if(y==1){swagg(th,j,x);String temp=new String(th);if(!set.contains(temp))queue.add(temp);set.add(temp);swagg(th,j,x);}else {swagg(th,j,x+3);String temp=new String(th);if(!set.contains(temp))queue.add(temp);set.add(temp);swagg(th,j,x+3);}if(x>0){swagg(th,j,j-1);String temp=new String(th);if(!set.contains(temp))queue.add(temp);set.add(temp);swagg(th,j,j-1);}if(x<2){swagg(th,j,j+1);String temp=new String(th);if(!set.contains(temp))queue.add(temp);set.add(temp);swagg(th,j,j+1);}}}}res++;}return -1;} }

    總結(jié)

    以上是生活随笔為你收集整理的leetcode 773. 滑动谜题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。