如何保存一个人移动到二维数组上的所有坐标?

时间:2018-11-28 16:55:51

标签: java arrays algorithm

标题

  

有一个人正试图在方板内部移动。木板是一个大小网格,其中点在其左上角,而点在其右下角。这个人只有遵循一些规则才能移动:

     

它将始终根据当前的风向移动(可能的方向是北,南,西,东,东北,西北,东南,西南)。   它只能访问董事会的特定单元一次。   它不能超出板的边界。   如果到达无法按照规则移动的点,它将停留在当前位置。   它只能移动到相邻的单元格(根据上述方向可能有8个移动)。   它将始终从该点(板的左上角)开始旅程。   它每秒只能移动一圈。   为了使他感到更困难,在旅途中风会多次改变方向。在男人开始移动之前(第0秒),您将始终得到风的方向,然后当风将要改变其方向时(以严格递增的顺序),您将获得以秒为单位的特定时间。

     

在完成了该人的所有旅程之后,您将必须指定该人没有在木板内部访问过多少个职位。

     

输入格式

     

在第一行中,您将获得两个整数'n'和'k',其中'n'代表电路板的尺寸。然后在接下来的“ k”行中,您将得到一个整数“ ti”和一个字符串“ w”。 'ti'表示在板上施加风向'w'的时间,以秒为单位.'w'的取值可能为N,S,W,E,NE,NW,SE或SW (分别代表北,南,西,东,东北,西北,东南或西南)。

     

约束

     

3 <= n <= 100000

     

2 <= k <= 100000

     

0 <= ti <= 100000

     

t0 = 0      

输出格式

     

输出该板子中该人未访问的位置数。

     

样本输入0

     

5 6

     

0 SE

     

1个网元

     

2 E

     

6 SW

     

15 N

     

20瓦

     

样本输出0

     

13

public class Solution {

    public static void main (String args []) {

        //Table
        int [][] board = new int [7][7]; 

        // Seconds available for moving
        int seconds = 43; 
        // Initial Man Coordinate
        int Man = board [0][0]; 

        // Two dimensional array to save the coordinates visited by the man
        int [][] isVisited = new int [7][7]; 

        // Formula to calculate the cells that are not visited by the man ( i know is wrong )
        int notVisited = isVisited.isEmpty(true) - isVisited.isEmpty(false);  

        for (int i=0;i<=board.length;i++) {
            for(int j=0;j<=board.length;j--) {

                while (seconds < 4 ) {
                    i++;
                    j++;
                    Man = board [i][j];

                    //Here should be the code to save the coordinates visited by the man -->

1 个答案:

答案 0 :(得分:1)

我首先要创建一个名为Board的新呼叫:

public class Board {
    private boolean[][] visited;
    private int boardSize;
    private int numVisited;

    public Board(int boardSize) {
        this.boardSize = boardSize;
        visited = new boolean[boardSize][boardSize];
    }

    public void setVisited(int x, int y) {
        if (!visited[x][y]) {
            visited[x][y] = true;
            numVisited++;
        }
    }

    public int getBoardSize() {
        return boardSize;
    }

    public int getNumVisited() {
        return numVisited;
    }

    public int getNumNotVisited() {
        return boardSize * boardSize - numVisited;
    }
}

之后,您可以创建Board

的实例
Board myBoard = new Board(7);

然后按照您的逻辑,您可以通过调用setVisited来设置要访问的单元格:

myBoard.setVisited(3, 3);

您可以通过调用countVisited

来计算访问单元的数量
int numberOfVisitedCells = myBoard.getNumVisited();

或者,如果您想要尚未访问的单元数:

int numberofCellsNotVisited = myBoard.getNumNotVisited();

编辑:感谢@Matthew的改进!