题目

大抵就是n行m列二维地图 A在(x,y),B在(a,b)。地图中有障碍物“#”示意不能通行,“.” 示意能够通行,A每次能够往上、下、左、右行走。
判断A是否能胜利走到B的地位


题解

思路就是BFS (套用BFS的模板框架) 判断条件为以后坐标是否与B的统一


BFS框架模板(Java)

//BFS算法框架boolean[][] mark = new boolean[n][m]; //拜访标记static int[][] go = {{0, -1}, {1, 0}, {-1, 0}, {0, 1}}; //方向向量static class State{    int x,y; //坐标地位    int step; //搜寻步数记录}boolean Check(State s){    //边界判断  return s.x>=0&&s.x<n&&s.y>0&&s.y<=m;}void BFS(State st){    queue<State> q;    State now,next;    st.step = 0; //步数清零;    q.add(st); //入队;    while(!q.isEmpty())    {        now = q.poll(); //队首元素出队;        if(now == 指标状态) //呈现指标状态,此时的step为最小值,做做相干解决后退出即可;        {            ……;            return ....;        }        //如果没有到指标状态            for(int i=0;i<4;i++)            {                next.x = now.x + go[i][0];//依照规定生成下一个状态                next.y = now.y + go[i][1];                if(CheckState(next)&&(依据题目批改条件)&&!mark) //未越界、未被拜访、满足题目条件                {                    next.step = now.step + 1;                    mark[next.x][next.y]=true;                    q.add(next);                }            }    }}public static void main(String[] args){    //输出    BFS();    //输入  }

题解代码

public class AandB {    //初始化节点    static class Node {        int x;        int y;        public Node(int x, int y) {            this.x = x;            this.y = y;        }        public Node() {        }    }    //初始化全局变量    static int n;    static int m;    //行走的方向    static int[][] dir = {{0, -1}, {1, 0}, {-1, 0}, {0, 1}};    //a、b代表各自的坐标    static int ax = -1;    static int ay = -1;    static int bx = -1;    static int by = -1;    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int total = scanner.nextint();        while (total-- > 0) {            n = scanner.nextint();            m = scanner.nextint();            Boolean[][] visit = new Boolean[n][m];            //拜访标记            String[] map = new String[n];            for (int i = 0; i < n; i++) {                map[i] = scanner.next();            }                          //初始化坐标            for (int i = 0; i < n; i++) {                for (int j = 0; j < m; j++) {                    if (map[i].charAt(j) == 'B') {                        bx = i;                        by = j;                    }                    if (map[i].charAt(j) == 'A') {                        ax = i;                        ay = j;                    }                }            }            if (bfs(ax, ay, map, visit)) {                System.out.println("yes");            } else {                System.out.println("no");            }        }    }        //越界    static Boolean check(Node node) {        return node.x >= 0 && node.x < n && node.y >= 0 && node.y < m;    }    static Boolean bfs(int x, int y, String[] map, Boolean[][] visit) {        Queue<Node> queue = new LinkedList<>();        queue.add(new Node(x, y));        while (!queue.isEmpty()) {            Node node = queue.poll();            if (node.x == bx && node.y == by) {                return true;            }            for (int i = 0; i < 4; i++) {                Node next = new Node();                next.x = node.x + dir[i][0];                next.y = node.y + dir[i][1];                //判断条件                if (check(next) && (map[next.x].charAt(next.y) == '.' || map[next.x].charAt(next.y) == 'B') && !visit[next.x][next.y]) {                    visit[next.x][next.y] = true;                    queue.add(next);                }            }        }        return false;    }}

输入输出数据

2   //两组数据2 2  //n行m列.BA.2 2#BA#