首页 > 编程语言 >呵呵算法题

呵呵算法题

时间:2024-08-05 20:07:41浏览次数:12  
标签:rowStart lights 呵呵 int 算法 rowEnd colEnd colStart

假定街道是棋盘型的,每格距离相等,车辆通过每格街道需要时间均为 timePerRoad;

街道的街口(交叉点)有交通灯,灯的周期 T(=lights[row][col])各不相同;

车辆可直行、左转和右转,其中直行和左转需要等相应 T 时间的交通灯才可通行,右转无需等待。

现给出 n * m 个街口的交通灯周期,以及起止街口的坐标,计算车辆经过两个街口的最短时间。

其中:

起点和终点的交通灯不计入时间,且可以在任意方向经过街口
不可超出 n * m 个街口,不可跳跃,但边线也是道路(即:lights[0][0] -> lights[0][1] 是有效路径)
入口函数定义:

/**

  • @param lights:n*m个街口每个交通灯的周期,值范围[0, 120],n和m的范围为[1,9]
  • @param timePreRoad:相邻两个街口之间街道的通行时间,范围为[0,600]
  • @param rowStart:起点的行号
  • @param colStart:起点的列号
  • @param rowEnd:终点的行号
  • @param colEnd:终点的列号
  • @return lights[rowStart][colStart] 与 lights[rowEnd][colEnd] 两个街口之间的最短通行时间
    */
    int calcTime(int[][] lights, int timePreRoad, int rowStart, int colStart, int rowEnd, int colEnd)
    输入描述
    第一行输入 n 和 m,以空格分隔

之后 n 行输入 lights矩阵,矩阵每行m个整数,以空格分隔

之后一行输入 timePerRoad

之后一行输入 rowStart colStart,以空格分隔

最后一行输入 rowEnd colEnd,以空格分隔

输出描述
lights[rowStart][colStart] 与 lights[rowEnd][colEnd] 两个街口之间的最短通行时间

用例
输入

3 3
1 2 3
4 5 6
7 8 9
60
0 0
2 2
输出

245
说明

行走路线为 (0,0) -> (0,1) -> (1,1) -> (1,2) -> (2,2) 走了4格路,2个右转,1个左转,共耗时 60+0+60+5+60+0+60=245

import java.util.*;

public class StreetNavigation {

    public static int calcTime(int[][] lights, int timePerRoad, int rowStart, int colStart, int rowEnd, int colEnd) {
        int n = lights.length;
        int m = lights[0].length;

        // Directions: right, down, left, up (clockwise)
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

        // Priority queue to store the current minimum distance nodes
        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
        pq.offer(new int[]{0, rowStart, colStart, -1});  // {current time, row, col, previous direction}

        // Distance array to keep track of the minimum time to reach each street corner
        int[][] dist = new int[n][m];
        for (int[] row : dist) {
            Arrays.fill(row, Integer.MAX_VALUE);
        }
        dist[rowStart][colStart] = 0;

        while (!pq.isEmpty()) {
            int[] curr = pq.poll();
            int currTime = curr[0];
            int r = curr[1];
            int c = curr[2];
            int prevDir = curr[3];

            // If we've reached the end, return the current time
            if (r == rowEnd && c == colEnd) {
                return currTime;
            }

            for (int d = 0; d < 4; d++) {
                int nr = r + directions[d][0];
                int nc = c + directions[d][1];

                if (nr >= 0 && nr < n && nc >= 0 && nc < m) {
                    int waitTime = 0;
                    if (prevDir != -1) {
                        if (d == (prevDir + 2) % 4) {
                            // Going straight (opposite direction)
                            waitTime = lights[r][c] - (currTime % lights[r][c]);
                            if (waitTime == lights[r][c]) waitTime = 0;
                        } else if ((d + 2) % 4 == prevDir) {
                            // Turning left
                            waitTime = lights[r][c] - (currTime % lights[r][c]);
                            if (waitTime == lights[r][c]) waitTime = 0;
                        }
                        // Turning right has no wait time
                    }
                    
                    int newTime = currTime + timePerRoad + waitTime;

                    if (newTime < dist[nr][nc]) {
                        dist[nr][nc] = newTime;
                        pq.offer(new int[]{newTime, nr, nc, d});
                    }
                }
            }
        }

        return dist[rowEnd][colEnd];
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] lights = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                lights[i][j] = scanner.nextInt();
            }
        }
        int timePerRoad = scanner.nextInt();
        int rowStart = scanner.nextInt();
        int colStart = scanner.nextInt();
        int rowEnd = scanner.nextInt();
        int colEnd = scanner.nextInt();
        scanner.close();

        System.out.println(calcTime(lights, timePerRoad, rowStart, colStart, rowEnd, colEnd));
    }
}

标签:rowStart,lights,呵呵,int,算法,rowEnd,colEnd,colStart
From: https://www.cnblogs.com/mingyu15/p/18343954

相关文章

  • 时间旅行者:LSTM算法的奥秘大揭秘!
    Hey小伙伴们,今天给大家带来一个超级有趣的主题——LSTM算法的基本结构和公式推导!......
  • 常见的PID的算法及代码示例
    常见的PID的算法及代码示例PID(比例-积分-微分)算法是控制系统中常用的一种反馈控制算法,它通过计算误差的比例、积分和微分来调整控制输入,以达到预定的控制目标。以下是一些常见的PID算法及代码示例:一、常见的PID算法位置式PID算法位置式PID算法直接计算控制量的绝对值,每次输......
  • 贪心算法-活动安排问题
    贪心算法贪心算法总是选择当前看起来最优的选择(局部最优解),希望得到的结果是一个整体最优解。但是,并非总是选择局部最优解就能够得到整体最优解,这一点需要在问题具有贪心选择性和优化子结构时才成立。贪心选择性贪心选择性:第一次做出贪心选择是正确的。优化子结构问题......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......
  • 代码随想录算法训练营day04之字符串
    题目及链接:344.反转字符串541.反转字符串||卡码网54.替换数字151.翻转字符串里的单词卡码网55.右旋字符串28.找出字符串中第一个匹配项的下标459.重复的子字符串344.反转字符串太简单就不写了541.反转字符串||题意:给定一个字符串s和一个整数k,从字符串开头算起,每......
  • 空域滤波算法
    空域滤波算法是图像处理中用于去除噪声的一类方法,它们直接在图像的像素坐标系中操作,通过分析图像中像素与周围像素的关系来去除噪声。以下是几种常见的空域滤波算法的原理描述及其在MATLAB中的实现代码。  1.均值滤波均值滤波是一种简单的线性滤波方法,它通过替换图像中每个......
  • 可用于机器学习的排列组合枚举算法含passcal - c shap-c源码
    可用于机器学习的排列组合枚举算法含passcal-cshap-c源码1机器学习和数据挖掘• 特征选择:在机器学习中,需要从多个特征中选择最有价值的组合。通过枚举不同的特征组合,可以找到最佳的特征集合。• 超参数优化:在训练模型时,需要调整多个超参数。通过枚举不同的超参数组......
  • 图像降噪算法概述
    图像降噪是图像预处理中非常重要的一步,旨在去除图像中的噪声,以提高图像质量并为后续的图像分析提供更好的基础。图像降噪算法可以根据其原理和技术进行分类,主要包括以下几个大类:1.空域滤波方法这些方法直接在像素级别上操作,通常涉及邻域内像素值的加权平均。均值滤波:简单地......
  • c++递归算法较难题:分解数字
    题目描述:输入自然数 n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复,要求输出降序排列。输入描述:一个待拆分的自然数n,(n≤50) 。输出描述:若干个拆分的加法等式。样例输入:5样例输出:5=55=4+15=3+25=3+1+15=2+2+15=2+1+1+15=1+1+1+1+1题目思想:将要分......
  • C++回溯算法经典例题:四皇后问题
    问题简介:在一个4×4的棋盘上,任意两个皇后都不能处在同一行、同一列任意两个皇后都不能处在同一斜线上(主斜线、反斜线)。题目分析:1.假设第一个皇后在(1,1):    1)在x=3时会卡死            2)在x=4时会卡死        2.假设第一个皇后在(2,1): ......