迷宫最短路径

图片说明

输入格式为

15
0 7 7 7
*5#++B+B+++++$3
55#+++++++###$$
###$++++++#+*#+
++$@$+++$$$3+#+
+++$$+++$+4###+
A++++###$@+$++A
+++++#++$#$$+++
A++++#+5+#+++++
+++$$#$++#++++A
+++$+@$###+++++
+###4+$+++$$+++
+#+3$$$+++$##++
+#*+#++++++#$$+
$####+++++++$##
3$+++B++B++++#5
第一行为矩阵阶数
第二行为开始和终点坐标
剩下为矩阵
package testDemo;

import java.util.*;
import java.awt.Point;
import java.io.*;

public class Main1 {

    static int[][] map;
    static int[][] book;
    public static void main(String args[])throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            int n = Integer.parseInt(line);
            String[] ars = br.readLine().split(" ");
            //开始xy
            int sx = Integer.parseInt(ars[0]);
            int sy = Integer.parseInt(ars[1]);
            //结束xy
            int ex = Integer.parseInt(ars[2]);
            int ey = Integer.parseInt(ars[3]);
            //地图
            map = new int[n][n];
            book = new int[n][n];

            for(int i = 0;i < n;i++){
                String t = br.readLine();
                for(int j = 0;j < t.length();j++){
                    char c = t.charAt(j);
                    if(c == '#' || c == '@'){
                        map[i][j] = 1;
                    }else{
                        map[i][j] = 0;
                    }
                    if(i == sx && j == sy){
                        book[i][j] = 0; 
                    }else{
                        book[i][j] = Integer.MAX_VALUE; 
                    }
                }
            }
            //这行以上都是处理输入输出


            Point p = new Point();
            p.x = sx;
            p.y = sy;
            int cnt = bfs(p, ex, ey, n);
            if(cnt == Integer.MAX_VALUE){
                System.out.println(-1);
            }else{
                System.out.println(cnt);
            }
        }
    }

    public static int bfs(Point t,int ex,int ey,int n){
        int arr3[] = {0,-1,0,1};
        int arr4[] = {-1,0,1,0};
        Deque<Point> que = new LinkedList<Point>();
        que.add(t);
        while(!que.isEmpty()){
            Point p = que.poll();

            if(p.x == ex && p.y == ey){
                return book[p.x][p.y];
            }

            for (int i=0;i<4;i++) {
                int x = p.x+arr3[i];
                int y = p.y+arr4[i];
                if(x>=0&&y>=0&&x<n&&y<n&&book[x][y]==Integer.MAX_VALUE&&map[x][y]==0) {
                    que.add(new Point(x,y));
                    book[x][y]=book[p.x][p.y]+1;
                }
            }

        }
        return Integer.MAX_VALUE;
    }
}

NC109 图片说明

import java.util.*;


public class Solution {
    /**
     * 判断岛屿数量
     * @param grid char字符型二维数组 
     * @return int整型
     */

    public int solve (char[][] grid) {
        // 岛屿数量
        int nums = 0;   
        // 0 没走过;1 走过
        byte[][] flag = new byte[grid.length][grid[0].length];
        LinkedList<Point> points = new LinkedList<>();
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                // 找到一个没走过的岛屿起始点
                if(grid[i][j] == '1' && flag[i][j] == 0) {
                    points.add(new Point(i, j));
                    flag[i][j] = 1;
                    nums++;
                    while(!points.isEmpty()) {
                        Point t = points.pollFirst();
                        int x = t.x;
                        int y = t.y;
                        // 四周的点加入队列
                        if(x - 1 >= 0 && x - 1 < grid.length && grid[x - 1][y] == '1' && flag[x - 1][y] == 0) {
                            flag[x - 1][y] = 1;
                            points.add(new Point(x - 1, y));
                        }
                        if(x + 1 >= 0 && x + 1 < grid.length && grid[x + 1][y] == '1' && flag[x + 1][y] == 0) {
                            flag[x + 1][y] = 1;
                            points.add(new Point(x + 1, y));
                        }
                        if(y - 1 >= 0 && y - 1 < grid[0].length && grid[x][y - 1] == '1' && flag[x][y - 1] == 0) {
                            flag[x][y - 1] = 1;
                            points.add(new Point(x, y - 1));
                        }
                        if(y + 1 >= 0 && y + 1 <grid[0].length && grid[x][y + 1] == '1' && flag[x][y + 1] == 0) {
                            flag[x][y + 1] = 1;
                            points.add(new Point(x, y + 1));
                        }
                    }
                }
            }
        }
        return nums;
    }
}