簡體   English   中英

如何更改二維布爾數組的值?

[英]How to change value of 2D bool array?

我有這個學校的作業:

想象一個棋盤和一只螞蟻。 螞蟻被隨機放在板上,然后它可以上下左右(不是對角線)行走。 螞蟻不能越過棋盤的邊緣(如果它嘗試,則不算作移動)。 任務是創建一個名為 Ants.java 的程序,該程序模擬螞蟻在棋盤上行走。 走到另一個方格而不是螞蟻當前所在的方格被稱為“一步”(即使螞蟻需​​要幾步才能移動......)。 每次模擬都應計算螞蟻訪問棋盤上所有方格所需的“步數”。 模擬必須進行十次,並應在模擬結束時計算平均值。 模擬運行的示例如下所示:

螞蟻

模擬 1 中的步數:708 模擬 2 中的步數:818 模擬 3 中的步數:953 模擬 4 中的步數:523 模擬 5 中的步數:671 模擬 6 中的步數:338模擬 7 中的步數:535 模擬 8 中的步數:702

我很確定我已經完成了大約 95%。 但是,我需要一個數組來存儲 bool 值,以查看螞蟻是否訪問了板上的正方形。 我真的不知道該怎么做。 忽略“isVisited”,這是我的第一個想法。

這是我現在的代碼:

public static void main(String[] args) {
    // Sums every step in the 10 iterations
    double totalNumber = 0;
    boolean[][] grid = new boolean[8][8];
        for (int r = 0; r< grid.length; r++)
        {
            for (int c = 0 ; c<grid[0].length; c++)
            {
               grid[r][c] = false;
            }
        }
    // Just a loop to make the ant walk 10 times
    for (int k = 1; k <= 10; k++) {


        // Setting board to false, not visited
    boolean isVisited = false;

    // Creating spawn points
    int x = (int) (Math.random() * (8 + 1)) + 1;
    int y = (int) (Math.random() * (8 + 1)) + 1;
    // Setting spawn point to 
    isVisited = true;


    // Variables, steps, min coord and max coords
    int count = 0;
    int minY = 1;
    int maxY = 8;
    int minX = 1;
    int maxX = 8;

    // All the unchecked places
    int unchecked = 64;
    // Places where the ant has been
    int alreadyChecked = 0;

    // While there's more than 0 unchecked places, random 1 - 4
    while (unchecked > 0) {
        int random = (int) (Math.random() * 4 + 1);

        // West
        if (random == 1) {
            // Move to the left
            x--;
            // If the ant falls off
            if (x < minX) {
                // Bump it back
                x++;
            }

            // If the place is visited
        if (isVisited) {
            // Already checked
            alreadyChecked++;
            // Count step anyway
            count++;
        }
        // If it's not
        if(!isVisited) {
        // Set to visited
            isVisited = true;
            // Remove 1 from the unchecked
            unchecked--;
            // And take a step
            count++;
        }

        }

        // East
        if (random == 2) {
            x++;
            if (x > maxX) {
                x--;

            }

            if (isVisited) {
                alreadyChecked++;
                count++;
            }
            if(!isVisited) {
            isVisited = true;
            unchecked--;
            count++;
            }

        }

        // North
        if (random == 3) {
            y++;
            if (y > maxY) {
                y--;
            }
            if (isVisited) {
                alreadyChecked++;
                count++;
            }

            if(!isVisited) {
        isVisited = true;
        unchecked--;
        count++;
            }
        }

        // South
        if (random == 4) {
            y--;

            if (y < minY) {
                y++;
            }
            if (isVisited) {
                alreadyChecked++;
                count++;
            }


                isVisited = true;
                unchecked--;
                count++;
        }



}
    /**
 * This simulation assumes Ant movement is discrete relative to grid cells
 * i.e. its either in one of these cells at a time, overlapping two cells in not allowed!!
 * **/
public class AntMovementSimulation 
{
    int onBoard[][] = null;
    int antPosX = 0;
    int antPosY = 0;
    int antPrevPosX = 0;
    int antPrevPosY = 0;

    int directionOfMovement = 0;
    int stepsCount = 0;

    AntMovementSimulation()
    {
        onBoard = new int[8][8];
        //initialize each position in onBoard to -1 ,implying Ant has not been placed yet, not even once!!
        for( int i = 0 ; i < 8 ; i++ )
        {
            for( int j = 0 ; j < 8 ; j++ )
            {
                onBoard[i][j] = -1;//implying Ant has not been placed yet, not even once!!
            }
        }

        //place Ant in random cell
        antPosX = (int)Math.round(Math.random()*7);//generating random number between 0 and 7, since index is from 0 to 7 as there are 8 cell!!
        antPosY = (int)Math.round(Math.random()*7);
        //assigning 1 to onBoard at index antPosX,antPosY to indicate Ant has been placed there
        onBoard[antPosX][antPosY] = 1;
    }

    /*this function returns false if any cell has -1,else true
     * cause when all cells have been traversed , each cell have non negative value,either 0 or 1 
     *  */
    public boolean areAllCellsTraversed()
    {
        boolean result = true;

        for( int i = 0 ; i < 8 ; i++ )
        {
            for( int j = 0 ; j < 8 ; j++ )
            {
                if( onBoard[i][j] == -1 )//implying this cell not traversed yet,i.e Ant not placed in this cell yet!!
                {
                    result = false;
                }
            }
        }
        return result;
    }

    public void simulate()
    {
        //loop while all cells have been not traversed
        while( !areAllCellsTraversed() )
        {
            directionOfMovement = (int)Math.round(Math.random()*3);//generating random number between 0 and 3
            switch( directionOfMovement )
            {
            case 0://move left-to-right
                antPosX += 1;
                if( antPosX >= 7 ) antPosX = 0; //since largest array index is 1 less than its size, we compare with 7 instead of 8                 
                break;

            case 1://move right-to-left
                antPosX -= 1;
                if( antPosX <= 0 ) antPosX = 7;                 
                break;

            case 2://move top-to-bottom
                antPosY += 1;
                if( antPosY >= 7 ) antPosY = 0;                 
                break;

            case 3://move bottom-to-top
                antPosY -= 1;
                if( antPosY <= 0 ) antPosY = 7;                 
                break;
            }

            //assign 0 to previous position, meaning Ant is no longer there
            onBoard[antPrevPosX][antPrevPosY] = 0;
            //assign 1 to new position , meaning Ant is here
            onBoard[antPosX][antPosY] = 1;

            stepsCount++;
            antPrevPosX = antPosX;
            antPrevPosY = antPosY;                  
        }   
        //once all cells have been traversed , print result!!
        printSteps();
    }   

    /*prints the total number of step taken to traverse all cells*/
    public void printSteps()
    {
        System.out.println("Total steps taken by Ant to traverse all cells = "+stepsCount);
    }

    public static void main(String[] args)
    {
        int sumOfTotalNumOfSteps = 0;
        AntMovementSimulation[] amsArray = new AntMovementSimulation[10];
        for( AntMovementSimulation ams: amsArray )
        {
            ams = new AntMovementSimulation();
            ams.simulate();
            sumOfTotalNumOfSteps += ams.stepsCount;
        }
        System.out.println("Average num of steps taken by Ant to traverse all cells = "+ sumOfTotalNumOfSteps/10);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM