跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 字节跳动面试题:滑动拼图 II
未分類
6 2 月 2021

字节跳动面试题:滑动拼图 II

字节跳动面试题:滑动拼图 II

資深大佬 : zzzrf 0

描述

在一个 3×3 的网格中,放着编号 1 到 8 的 8 块板,以及一块编号为 0 的空格。 一次移动可以把空格 0 与上下左右四邻接之一的板子交换。 给定初始和目标的板子排布,返回到目标排布最少的移动次数。 如果不能从初始排布移动到目标排布,返回-1.

在线评测地址

样例 1

输入: [  [2,8,3],  [1,0,4],  [7,6,5] ] [  [1,2,3],  [8,0,4],  [7,6,5] ] 输出: 4  解释: [                 [  [2,8,3],          [2,0,3],  [1,0,4],   -->    [1,8,4],  [7,6,5]           [7,6,5] ]                 ]  [                 [  [2,0,3],          [0,2,3],  [1,8,4],   -->    [1,8,4],  [7,6,5]           [7,6,5] ]                 ]  [                 [  [0,2,3],          [1,2,3],  [1,8,4],   -->    [0,8,4],  [7,6,5]           [7,6,5] ]                 ]  [                 [  [1,2,3],          [1,2,3],  [0,8,4],   -->    [8,0,4],  [7,6,5]           [7,6,5] ]                 ] 

样例 2

输入: [[2,3,8],[7,0,5],[1,6,4]] [[1,2,3],[8,0,4],[7,6,5]] 输出: -1 

使用单向 BFS 算法

public class Solution {     /**      * @param init_state: the initial state of chessboard      * @param final_state: the final state of chessboard      * @return: return an integer, denote the number of minimum moving      */     public int minMoveStep(int[][] init_state, int[][] final_state) {         String source = matrixToString(init_state);         String target = matrixToString(final_state);                  Queue<String> queue = new LinkedList<>();         Map<String, Integer> distance = new HashMap<>();                  queue.offer(source);         distance.put(source, 0);                  while (!queue.isEmpty()) {             String curt = queue.poll();             if (curt.equals(target)) {                 return distance.get(curt);             }                          for (String next : getNext(curt)) {                 if (distance.containsKey(next)) {                     continue;                 }                 queue.offer(next);                 distance.put(next, distance.get(curt) + 1);             }         }                  return -1;     }          public String matrixToString(int[][] state) {         StringBuilder sb = new StringBuilder();         for (int i = 0; i < 3; i++) {             for (int j = 0; j < 3; j++) {                 sb.append(state[i][j]);             }         }         return sb.toString();     }          public List<String> getNext(String state) {         List<String> states = new ArrayList<>();         int[] dx = {0, 1, -1, 0};         int[] dy = {1, 0, 0, -1};                  int zeroIndex = state.indexOf('0');         int x = zeroIndex / 3;         int y = zeroIndex % 3;                  for (int i = 0; i < 4; i++) {             int x_ = x + dx[i];             int y_ = y + dy[i];             if (x_ < 0 || x_ >= 3 || y_ < 0 || y_ >= 3) {                 continue;             }                          char[] chars = state.toCharArray();             chars[x * 3 + y] = chars[x_ * 3 + y_];             chars[x_ * 3 + y_] = '0';             states.add(new String(chars));         }                  return states;     } } 

使用双向 BFS 算法。可以把这份代码当模板背诵。

public class Solution {     /**      * @param init_state: the initial state of chessboard      * @param final_state: the final state of chessboard      * @return: return an integer, denote the number of minimum moving      */     public int minMoveStep(int[][] init_state, int[][] final_state) {         String source = matrixToString(init_state);         String target = matrixToString(final_state);                  if (source.equals(target)) {             return 0;         }                  Queue<String> forwardQueue = new ArrayDeque<>();         Set<String> forwardSet = new HashSet<>();         forwardQueue.offer(source);         forwardSet.add(source);          Queue<String> backwardQueue = new ArrayDeque<>();         Set<String> backwardSet = new HashSet<>();         backwardQueue.offer(target);         backwardSet.add(target);                  int steps = 0;         while (!forwardQueue.isEmpty() && !backwardQueue.isEmpty()) {             steps++;             if (extendQueue(forwardQueue, forwardSet, backwardSet)) {                 return steps;             }                          steps++;             if (extendQueue(backwardQueue, backwardSet, forwardSet)) {                 return steps;             }         }                  return -1;     }          private boolean extendQueue(Queue<String> queue,                                 Set<String> set,                                 Set<String> targetSet) {         int size = queue.size();         for (int i = 0; i < size; i++) {             String curt = queue.poll();             for (String next : getNext(curt)) {                 if (set.contains(next)) {                     continue;                 }                 if (targetSet.contains(next)) {                     return true;                 }                 queue.offer(next);                 set.add(next);             }         }         return false;     }          public String matrixToString(int[][] state) {         StringBuilder sb = new StringBuilder();         for (int i = 0; i < 3; i++) {             for (int j = 0; j < 3; j++) {                 sb.append(state[i][j]);             }         }         return sb.toString();     }          public List<String> getNext(String state) {         List<String> states = new ArrayList<>();         int[] dx = {0, 1, -1, 0};         int[] dy = {1, 0, 0, -1};                  int zeroIndex = state.indexOf('0');         int x = zeroIndex / 3;         int y = zeroIndex % 3;                  for (int i = 0; i < 4; i++) {             int x_ = x + dx[i];             int y_ = y + dy[i];             if (x_ < 0 || x_ >= 3 || y_ < 0 || y_ >= 3) {                 continue;             }                          char[] chars = state.toCharArray();             chars[x * 3 + y] = chars[x_ * 3 + y_];             chars[x_ * 3 + y_] = '0';             states.add(new String(chars));         }                  return states;     } } 

更多题解参考

大佬有話說 (13)

  • 資深大佬 : sweetsorrow211

    额 这东西能让我 CURD 更快点吗

  • 資深大佬 : whileFalse

    @sweetsorrow211 不能,但是能让你入职之后干着 CURD 的工作感觉更傻逼

  • 資深大佬 : vcode

    看不懂

  • 資深大佬 : yaphets666

    如何学习才能达到这种程度呢? 基础知识,除了数据结构之外,还需要哪些呢?

  • 資深大佬 : zproo

    字节传统艺能

  • 資深大佬 : tzl

    大三用 python 写过,当时写的单向广搜

  • 資深大佬 : xinyusir

    这不是八数码问题吗

  • 資深大佬 : yazoox

    现在的程序员面试,都是这类“高考题“啊……

  • 資深大佬 : 1343EFF

    八皇后

  • 資深大佬 : ruyu

    懂了, 感谢主分享

  • 資深大佬 : ruyu

    甚至还能用 A* 算法… 不过看了看九章算法的主页, 感觉有点卷啊

  • 資深大佬 : yazoox

    请教一下,leetcode 的题号是多少?

  • 主 資深大佬 : zzzrf

    @yazoox 字节现在好像确实有点卷,别人算法题一两道,它直接上卷子……

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具