美文网首页
Acwing 845

Acwing 845

作者: Wilbur_ | 来源:发表于2021-01-21 01:09 被阅读0次

    这道题实际上最主要是要理解如何把整个3x3的矩阵转化为一个最小路径的图。然后用bfs来解决。
    其实核心关键就在于每次尝试换x和它周围的一个数字的时候,你要记录这次是否之前换过,并且距离是多少(距离就是bfs第一次换到的地方,因为bfs本身就带有最短路径的属性)
    想到这点就能够通过map来记录每次交换的距离并且之前是否交换过了。然后如果交换到了“12345678x”这个最终节点,那就输出答案,否则遍历所有节点后还没到最终节点就表示换不到,输出-1
    下面是代码:

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] arg) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] in = br.readLine().split(" ");
            String start = "";
            for (String s : in) start += s;
            System.out.print(bfs(start));
        }
        static int bfs(String s) {
            int[][] dirs = new int[][] {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
            String end = "12345678x";
            Queue<String> q = new LinkedList<>();
            Map<String, Integer> map = new HashMap<>();
            map.put(s,0);
            q.add(s);
            while (!q.isEmpty()) {
                String cur = q.poll();
                int distance = map.get(cur);
                if (cur.equals(end)) return distance;
                char[] cArr = cur.toCharArray();
                int num = cur.indexOf('x');
                int i = num / 3, j = num % 3;
                for (int[] dir : dirs) {
                    int x = i + dir[0], y = j + dir[1];
                    if (x >= 0 && x < 3 && y >= 0 && y < 3) {
                        char temp = cArr[num];
                        cArr[num] = cArr[x * 3 + y];
                        cArr[x * 3 + y] = temp;
                        String nString = new String(cArr);
                        if (!map.containsKey(nString)) {
                            map.put(nString, distance + 1);
                            q.add(nString);
                        }
                        temp = cArr[num];
                        cArr[num] = cArr[x * 3 + y];
                        cArr[x * 3 + y] = temp;
                    }
                }
            }
            return -1;
        }
    }
    

    相关文章

      网友评论

          本文标题:Acwing 845

          本文链接:https://www.haomeiwen.com/subject/sxxrzktx.html