框架
73. 滑动谜题
分析:
- 图,空格处可以和上下左右交换
- 考虑BFS,BFS本质是遍历问题
- 建立映射关系,使一维字符串找到相邻的字符
- visited数组记录出现过的字符串
class Solution {
//建立映射关系
int[][] exchangeArray = new int[][]{
{1, 3},
{0, 2, 4},
{1, 5},
{0, 4},
{1, 3, 5},
{2, 4}
};
public int slidingPuzzle(int[][] board) {
// 初始状态转字符串
char[] chars = new char[6];
int index = 0;
String start = "";
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[0].length;j++) {
start+=board[i][j];
}
}
String target = "123450";
//BFS模板
Queue<String> q = new ArrayDeque<>();
Set<String> visited = new HashSet<>();
q.add(start);
int step = 0;
while(!q.isEmpty()) {
int sz = q.size();
for(int i=0;i<sz;i++) {
String cur = q.poll();
//满足条件
if(cur.equals(target)) {
return step;
}
//不满足条件,找到0位置处,经行交换操作
int position = cur.indexOf('0');
int[] exchanges = exchangeArray[position];
//添加点
for(int neighbor:exchanges) {
String s = exchangeString(cur,position,neighbor);
if(!visited.contains(s)) {
q.offer(s);
visited.add(s);
}
}
}
step++;
}
return -1;
}
private String exchangeString(String cur, int src, int dis) {
// TODO Auto-generated method stub
char[] chars = cur.toCharArray();
char temp = chars[dis];
chars[dis] = chars[src];
chars[src] = temp;
return new String(chars);
}
}