java-HJ43_迷宫问题

java-HJ43 迷宫问题

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * HJ43 迷宫问题
 * @author d3y1
 */
public class Main {
    public static void main(String[] args) {
        // solution1();
        // solution2();
        solution3();
    }

    private static int[] dX = new int[]{0, 0, 1, -1};
    private static int[] dY = new int[]{1, -1, 0, 0};

    private static int row;
    private static int col;
    private static int[][] matrix;
    private static boolean[][] visited;
    private static Step[][] pre;

    private static Queue<Step> stepsQueue = new LinkedList<>();

    /**
     * dfs
     */
    private static void solution1(){
        Scanner in = new Scanner(System.in);
        
        row = in.nextInt();
        col = in.nextInt();

        matrix = new int[row][col];
        visited = new boolean[row][col];
        pre = new Step[row][col];
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                matrix[i][j] = in.nextInt();
            }
        }

        Step start = new Step(0, 0);

        dfs(start);

        printPath(row-1, col-1);
    }

    private static void dfs(Step curr){
        if(curr.x==row-1 && curr.y==col-1){
            return;
        }

        visited[curr.x][curr.y] = true;

        for(int i=0; i<4; i++){
            Step next = new Step(curr.x+dX[i], curr.y+dY[i]);
            if(canGo(next)){
                pre[next.x][next.y] = curr;
                dfs(next);
            }
        }
        visited[curr.x][curr.y] = false;
    }


    /**
     * bfs
     */
    private static void solution2(){
        Scanner in = new Scanner(System.in);

        row = in.nextInt();
        col = in.nextInt();

        matrix = new int[row][col];
        visited = new boolean[row][col];
        pre = new Step[row][col];
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                matrix[i][j] = in.nextInt();
            }
        }

        Step start = new Step(0, 0);
        stepsQueue.add(start);

        bfs();

        printPath(row-1, col-1);
    }

    private static void bfs(){
        while (stepsQueue.size()!=0){
            Step curr = stepsQueue.poll();
            if(curr.x==row-1 && curr.y==col-1){
                break;
            }
            for(int i=0; i<4; i++){
                Step next = new Step(curr.x+dX[i], curr.y+dY[i]);
                if(canGo(next)){
                    stepsQueue.add(next);
                    pre[next.x][next.y] = curr;
                }
            }
            visited[curr.x][curr.y] = true;
        }
    }

    private static boolean canGo(Step next){
        // 越界
        if(next.x<0 || next.y<0 || next.x>=row || next.y>=col){
            return false;
        }

        // 墙壁
        if(matrix[next.x][next.y] == 1){
            return false;
        }

        // 已访问
        if(visited[next.x][next.y]){
            return false;
        }

        return true;
    }

    /**
     * 打印路径
     * @param x
     * @param y
     */
    private static void printPath(int x, int y){
        if(x==0 && y==0){
            System.out.println("("+x+","+y+")");
            return;
        }

        Step previous = pre[x][y];
        printPath(previous.x, previous.y);

        System.out.println("("+x+","+y+")");
    }

    private static class Step {
        int x;
        int y;

        private Step(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    
    /////////////////////////////////////////////////////////////////////////////////////

    private static int n,m;
    private static boolean[][] isVisited;
    private static int[] dx = new int[]{-1, 1, 0, 0};
    private static int[] dy = new int[]{0, 0, -1, 1};

    /**
     * bfs
     */
    private static void solution3(){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        isVisited = new boolean[n][m];
        int[][] maze = new int[n][m];
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                maze[i][j] = in.nextInt();
            }
        }

        Queue<Node> queue = new LinkedList<>();
        queue.offer(new Node(0, 0));
        isVisited[0][0] = true;

        int size;
        Node node,path=null;
        int nextRow,nextCol;
        boolean found = false;
        while(!queue.isEmpty()){
            if(found){
                break;
            }
            size = queue.size();
            while(size-- > 0){
                node = queue.poll();
                if(node.row==n-1 && node.col==m-1){
                    found = true;
                    path = node;
                }
                if(found){
                    break;
                }
                for(int i=0; i<4; i++){
                    nextRow = node.row+dx[i];
                    nextCol = node.col+dy[i];
                    if(isValid(nextRow, nextCol) && !isVisited[nextRow][nextCol]){
                        isVisited[nextRow][nextCol] = true;
                        if(maze[nextRow][nextCol] == 0){
                            queue.offer(new Node(nextRow, nextCol, node));
                        }
                    }
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        while(path != null){
            sb.insert(0, "("+path.row+","+path.col+")"+"\n");
            path = path.pre;
        }

        System.out.println(sb);
    }

    private static boolean isValid(int row, int col){
        if(0<=row&&row<n && 0<=col&&col<m){
            return true;
        }

        return false;
    }

    private static class Node {
        int row;
        int col;
        public Node(int row, int col){
            this.row = row;
            this.col = col;
        }

        public Node(int row, int col, Node pre){
            this.row = row;
            this.col = col;
            this.pre = pre;
        }

        Node pre = null;
    }
}
### 回答1: hj-4wd_pwm_fk.h是一个C编程语言程序的头文件。该头文件中包含了一些函数和定义,用于控制四轮驱动机器人的PWM(Pulse Width Modulation,脉宽调制)输出。 在机器人控制中,PWM信号可以用来控制电机的速度和方向,实现机器人前进、后退、转向等功能。hj-4wd_pwm_fk.h中定义了一些函数,可以设置PWM的占空比和频率,并可以控制机器人的运动。 除了PWM输出控制函数之外,hj-4wd_pwm_fk.h还定义了一些常量和类型,可以方便地控制各种传感器和电机组件。这些常量和类型包括PIN定义(用于指定GPIO端口)和MOTOR定义(用于指定电机类型和输出配置)。 总的来说,hj-4wd_pwm_fk.h提供了一组函数和常量,可以用来控制hj-4wd_pwm_fk机器人的电机、传感器和其他组件,从而实现各种机器人运动控制功能。 ### 回答2: hj-4wd_pwm_fk.h是一段控制四轮驱动车辆PWM的C语言代码。其中,PWM表示脉冲宽度调制,是一种调节电子设备输出的电压或电流的方法。hj-4wd_pwm_fk.h中的代码提供了对车辆四个轮子的PWM输出控制。该代码还使用了前向运动、后向运动、左转和右转函数,可以控制车辆的各种动作。此外,代码还包含了I2C总线通信相关函数以及其他常用的控制指令函数。在程序使用中,需要先将hj-4wd_pwm_fk.h中的头文件包含进来,然后再调用相关的函数进行控制。这段代码能够使得用户轻松地控制四轮驱动车辆,实现各种动作和指令的发送。但是,正确的使用本代码需要相关知识和技能,并且在实际应用中还需要做好安全相关的措施,以免发生意外。 ### 回答3: hj-4wd_pwm_fk.h是一种用于机器人控制的驱动程序,它使用PWM控制信号驱动机器人车辆的电机运动。这种驱动程序适用于4个轮子驱动(4WD)的机器人车辆。该程序中的FK(Forward Kinematics)功能可以将机器人车辆的运动转换为位置和方向的数学模型,使得用户可以通过编程实现车辆的运动控制。通过使用该驱动程序,用户可以轻松控制机器人车辆的速度和转向,以及实现均衡和定位控制等高级功能。此外,该驱动程序还提供了可扩展性和灵活性,用户可以根据需要对控制参数进行修改,以满足不同的应用需求。总之,hj-4wd_pwm_fk.h是一种功能强大、易于使用的机器人控制驱动程序,适用于各种机器人应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值