BFS_4:奇怪的电梯

本文介绍了一个基于广度优先搜索(BFS)算法解决的问题——奇怪的电梯。在一个n*m的棋盘上,一匹马从指定位置出发,计算到达棋盘上任意一点所需的最少步数。文章提供了完整的Java实现代码,包括节点定义、主函数流程及搜索过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS_4:奇怪的电梯

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入格式
一行四个数据,棋盘的大小和马的坐标

输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

3 3 1 1
0    3    2    
3    -1   1    
2    1    4    
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node_4{
    int x;
    int step;
    public Node_4(int x, int step) {
        this.x = x;
        this.step = step;
    }
}
public class BFS_4 {
    static  int N = 210;
    static int n;
    static int[] mp = new int[N];
    static int[] vis = new int[N] ;
    static int start,end;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        start = scanner.nextInt();end = scanner.nextInt();
        for (int i = 1; i <= n ; i++) {
            mp[i] = scanner.nextInt();
        }
        Node_4 node = new Node_4(start,0);
        dfs(node);
        System.out.println(-1);
    }

    public static void dfs(Node_4 node) {
        Queue<Node_4> queue  = new LinkedList<>();
        queue.offer(node);
        vis[node.x] = 1;
        while (!queue.isEmpty()){
            Node_4 cur = queue.peek();
            //出口条件
            if(cur.x == end){
                System.out.println(cur.step);
                System.exit(0);
            }
            //进行不定方向的搜索
            //电梯上方向
            int dx = cur.x + mp[cur.x];
            if(dx<=n&&vis[dx]==0){
                //点与点之间的独立性
                Node_4 temp = new Node_4(dx,cur.step+1);
                queue.offer(temp);
                vis[dx] = 1;
            }
            //电梯下方向
            dx = cur.x - mp[cur.x];
            if(dx>=1&&vis[dx]==0){
                //点与点之间的独立性
                Node_4 temp = new Node_4(dx,cur.step+1);
                queue.offer(temp);
                vis[dx] = 1;
            }
            queue.poll();
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值