八数码问题 Sliding Puzzle II

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<String>();
				Set<String> set = new HashSet<String>();
		
				queue.offer(source);
				set.add(source);
		
				int result = 0;
				while (!queue.isEmpty()) {
					int n = queue.size();
					for (int i = 0; i < n; i++) {
						String cur = queue.poll();
						if (cur.equals(target)) {
							return result;
						}
						
						for (String next : getNext(cur)) {
							if (!set.contains(next)) {
								queue.offer(next);
								set.add(next);
							}
						}
					}
					result += 1;
				}
				return -1;
		}

private String matrixToString(int[][] state) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 3; ++i) {
			for (int j = 0; j < 3; ++j) {
				sb.append(state[i][j]);	
			}
}
return sb.toString();
}

//字符串的下标和矩阵的位置转换
private List<String> getNext(String cur) {
		List<String> result = new ArrayList<>();
		
		int zeroIndex = cur.indexOf('0');
		int cx = zeroIndex / 3;
		int cy = zeroIndex % 3;              //字符串index 转换到矩阵坐标套路
		
		int[] dx = {0, 0, 1, -1};
		int[] dy = {1, -1, 0, 0};
		
		for (int i = 0; i < 4; i++) {
				int nx = cx + dx[i];
				int ny = cy + dy[i]; //遍历到下一个坐标
				if (nx < 0 || nx >= 3 || ny < 0 || ny >= 3) continue;
				
				char[] chars = cur.toCharArray();
				chars[zeroIndex] = chars[nx * 3 + ny];
				chars[nx * 3 + ny] = '0';
				result.add(new String(chars));
		}
		return result;
		}
}

最后更新于

这有帮助吗?