leetcode 773. 滑动谜题
生活随笔
收集整理的這篇文章主要介紹了
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?是一個如上所述的 2 x 3 的數(shù)組.
- board[i][j]?是一個?[0, 1, 2, 3, 4, 5]?的排列.
解題思路
所以每一個字符串就代表謎板的一個狀態(tài)
利用隊(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 149. 直线上最多的
- 下一篇: leetcode 909. 蛇梯棋