IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 用队列解决骑士移动问题 -> 正文阅读

[数据结构与算法]用队列解决骑士移动问题

一?问题描述

计算骑士从一个位置移动到另外一个位置所需的最少移动次数。骑士移动规则如下图。

输入:测试用例包含3行。

第1行:表示棋盘的长度?L,范围在 [4,300],棋盘的大小为?L *?L。

第2行:骑士在棋盘的开始位置。

第3行:骑士在棋盘的结束位置。

输出:输出骑士从起点移动到终点所需的最少移动次数。如果起点和终点相等,则移动次数为零。

下面是三组测试用例的结果。

输入

输出

8

(0,0)

(7,0)

5

100

(0,0)

(30,50)

28

10

(1,1)

(1,1)

0

二?算法设计

本问题求解棋盘从起点到终点最短距离问题可以使用队列进行广度优先搜索,步骤如下:

1?如果起点正好等于终点,则返回 0。

2?将起点放入队列。

3?如果队列不为空,则队头出队,否则扩展8个方向,如果找到目标,则立即返回步数加1,否则判断是否越界;如果没有越界,则将步数加1,并放入队列,标记棋盘已访问。如果骑士的当前位置为(x,y),则移动时,当前位置坐标加上偏移量即可。例如骑士从当前位置移到右上角的位置(x-2,y+1),如下图所示。

8个方向的位置偏移如下。

x 方向:{-2,-2,-1,-1,1,1,2,2}

y?方向:{1,-1,2,-2,2,-2,1,-1}

三?实现

package concurrent;

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

/**
* @className: KnightMove
* @description: 骑士移动问题
* @date: 2022/3/5
* @author: cakin
*/
public class KnightMove {
    public static void main(String[] args) {
        int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
        int dy[] = {1, -1, 2, -2, 2, -2, 1, -1};
        Scanner input = new Scanner(System.in);
        // 棋盘的大小
        int lengh = input.nextInt();
        // 标记棋盘位置是否访问过
        boolean[][] visitFlag = new boolean[lengh][lengh];
        // 开始位置
        int sx = input.nextInt();
        int sy = input.nextInt();
        // 结束位置
        int ex = input.nextInt();
        int ey = input.nextInt();
        // 中间位置
        int tx;
        int ty;
        if (sx == ex && sy == ey) {
            System.out.println("移到步数为0");
            return;
        }
        // 定义一个队列
        Queue<Point> queue = new LinkedList<>();
        // 开始位置
        Point start = new Point();
        start.x = sx;
        start.y = sy;
        start.step = 0;
        // 进入队列
        queue.offer(start);
        int step;
        int x;
        int y;
        while (!queue.isEmpty()) {
            // 取队列头元素,同时把这个元素弹出
            start = queue.poll();
            x = start.x;
            y = start.y;
            step = start.step;
            for (int i = 0; i < 8; i++) {
                tx = x + dx[i];
                ty = y + dy[i];
                if (tx == ex && ty == ey) {
                    System.out.println("移到步数为" + (step + 1));
                    return;
                }
                if (tx >= 0 && tx < lengh && ty >= 0 && ty < lengh && !visitFlag[tx][ty]) {
                    // 中间位置
                    Point node = new Point();
                    node.x = tx;
                    node.y = ty;
                    node.step = step + 1;
                    // 满足条件入队
                    queue.offer(node);
                    visitFlag[tx][ty] = true;
                }


            }
        }
    }
}

/**
* @className: Point
* @description: 描述棋盘上的一个点
* @date: 2022/3/5
* @author: cakin
*/
class Point {
    // x 坐标
    public int x;
    // y 坐标
    public int y;
    // 步数
    public int step;
}

四?测试

绿色为输入,白色为输出

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:24:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:48:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码