穿越雷区(Java--BFS解法)

穿越雷区(Java–BFS解法)

题目链接:http://oj.ecustacm.cn/problem.php?id=1266
解题代码(内含注释思路)

import java.util.*;

public class Main {
    static int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
    static String[][] map = new String[100][100];
    static int[][] vis = new int[100][100];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++) 
                map[i][j] = sc.next();
        int ax=0,ay=0,bx=0,by=0;
        for(int i=0;i<n;i++)//计算起点坐标、终点坐标
            for(int j=0;j<n;j++) {
                ax = (map[i][j].equals("A") ? i:ax); ay = (map[i][j].equals("A") ? j:ay);
                bx = (map[i][j].equals("B") ? i:bx); by = (map[i][j].equals("B") ? j:by);
            }
        Queue<Node> queue = new LinkedList<>();
        queue.add(new Node(ax,ay,0,"0"));
        while(!queue.isEmpty()){
            Node node = queue.poll();
            //出界考虑,跳过
            if (node.x<0||node.x>=n||node.y<0||node.y>=n) continue;
            //违规走法被拒绝,跳过【不能连续++,不能连续--】
            if (node.last.equals(map[node.x][node.y])) continue;
            //访问过的节点,跳过,保证只输出一条路的结果
            //并且绝对是最短的
            if (vis[node.x][node.y] >= 1) continue;

            vis[node.x][node.y]++;//访问过就记录上,访问次数
            if (node.x==bx&&node.y==by)//到达了终点
                System.out.println(node.footNum);
            //四向扩散查终点
            for (int i = 0; i < 4; i++)
                queue.add(new Node(
                node.x+dir[i][0],
                node.y+dir[i][1],
                node.footNum+1,
                map[node.x][node.y]));
        }
    }

}

class Node{
    int x,y;
    int footNum;
    String last;
    public Node(int x,int y,int footNum,String last) {
        this.x=x;
        this.y=y;
        this.footNum =footNum;
        this.last=last;
    }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值