首页 > 解决方案 > 在二维数组中查找到拐角的最短路径

问题描述

我有以下 2D int 数组(这是一个棋盘游戏)。鉴于我的棋子 5 在哪里,我如何确定 4 个角(数字 6)中离国王最近的角(不考虑障碍物)我不想要最短的誓言,我想要离棋子 5 最近的角.我怎样才能得到这个?

013 | 6 0 2 0 0 2 0 0 0 0 0 0 6 
012 | 0 2 0 0 0 4 0 0 0 0 0 0 0 
011 | 2 0 0 0 0 0 0 0 0 0 0 0 0 
010 | 0 0 0 0 0 0 0 0 0 0 0 0 0 
009 | 0 0 5 0 0 0 0 0 0 0 0 0 0 
008 | 0 0 0 0 0 0 0 0 0 2 0 0 0 
007 | 0 0 0 0 0 0 8 0 0 0 0 0 0 
006 | 2 0 0 0 0 0 0 0 0 0 0 0 0 
005 | 0 2 0 0 0 0 0 0 0 0 0 0 0 
004 | 0 0 0 0 0 0 0 0 0 0 0 0 0 
003 | 0 2 0 0 2 0 0 0 0 0 0 0 0 
002 | 0 0 0 0 0 0 0 0 0 0 0 0 0 
001 | 6 0 0 0 0 0 0 0 0 0 0 0 6 

我忘了添加我的代码:这是我开始的部分

public int findNearestKingExist(Board board) {
        int[] kingPos = board.findKing();

        int[][] grid = board.board;

        int x = kingPos[0];
        int y = kingPos[1];

        int topLeft = Math.abs(grid[x][y] + grid[0][0]);
        int bottLeft = Math.abs(grid[x][y] + grid[0][12]);
        int topRight = Math.abs(grid[x][y] + grid[12][0]);
        int bottRight = Math.abs(grid[x][y] + grid[12][12]);

        int shortestDistance = Math.min(Math.min(topLeft, topRight), Math.min(bottLeft, bottRight));

        return shortestDistance;
    }

标签: javaarrays

解决方案


这更像是一道数学题。

如果您假设数组是笛卡尔图的象限,请使用距离公式,以数组索引作为坐标。

假设您将元素存储为 grid[r][c]:计算以下内容:

int tl = (int) Math.pow(r, 2) +Math.pow(c, 2);
int tr = (int) Math.pow(grid.length - c, 2)  + Math.pow(r, 2);
int bl = (int) Math.pow(grid.length - r, 2)  + Math.pow(c, 2);
int br = (int) Math.pow(grid.length - c, 2)  + Math.pow(grid.length - r, 2);

然后比较整数,最小的是最接近的。

笔记:

我没有求和的平方根,因为这不会改变哪个点最接近,只是增加了另一个不必要的计算步骤。

我也没有为所有纵坐标或横坐标为 0 的坐标减去 0,原因很明显 XD。

编辑:

忘记将类型转换为 int。


推荐阅读