GridPath is #4 from the from the 2024 AP Computer Science A Free Response problems.

https://apcentral.collegeboard.org/media/pdf/ap24-frq-comp-sci-a.pdf

Part (a) getNextLoc method

public Location getNextLoc(int row, int col)
{
    Location belowLoc = new Location(row + 1, col);
    Location rightLoc = new Location(row, col + 1);
    
    if(row == grid.length - 1)
        return rightLoc;
    
    if(col == grid[0].length - 1)
        return belowLoc;
    
    if(grid[row + 1][col] < grid[row][col + 1])
        return belowLoc;
    else
        return rightLoc;
}

This is a revised solution. My original getNextLoc solution contained a subtle error.

Part (b) sumPath method

public int sumPath(int row, int col)
{
    int sum = grid[row][col];
    Location loc = getNextLoc(row, col);
    
    while(loc != null)
    {
        sum += grid[loc.getRow()][loc.getCol()];
        
        if(loc.getRow() < grid.length - 1 ||
                loc.getCol() < grid[0].length - 1)
            loc = getNextLoc(loc.getRow(), loc.getCol());
        else
            loc = null;
    }
    
    return sum;
}

Java files with test code

FourTest.java includes JUnit 5 test code with the examples from the problem. See Running JUnit 5 tests. Location.java includes working equals, toString, and hashCode methods.

Location.java
GridPath.java
FourTest.java

2024 AP CS Exam Free Response Solutions

Help & comments

Get help from AP CS Tutor Brandon Horn

See an error? Question? Please comment below.

Comment on GridPath

2024-05-13 comment

Ray Stuckey

What about doing part b recursively?
** spoilers below**
Something like this

public int sumPath(int row, int col) {
    //part b
    if (grid[0].length - 1 == col && grid.length - 1 == row) {
        return grid[row][col];
    }
    Location next = getNextLoc(row, col);
    return grid[row][col] + sumPath(next.getRow(), next.getCol());
}

Response

Yes. This works.

I didn’t post a recursive solution since I didn’t personally see it adding anything, but I could certainly see it being more intuitive for others.

2024-05-17 comment

Mike Crudele, APCS Teacher at Doral Academy

//my recursive solution:   
public int sumPathRec(int row, int col) {
    if (row == grid.length-1 && col == grid[0].length-1) {
        return grid[row][col];
    }
    else {
        Location loc = getNextLoc(row, col);
        int nextRow = loc.getRow();
        int nextCol = loc.getCol();
        return grid[row][col] + sumPath(nextRow, nextCol); 
    }
}

Response

Yep. This works. Thanks for sharing.

2024-07-03 comment

Anonymous

Answer to part (a) uses a confusing mixed approach. Either you first define the below and right locations and then use getRow() and getCol() to access the grid, or you use the given row and col values and only create the location you need to return.

Answer to part (b) could start with a sum of zero and loc = new Location(row, col).

Response

Sure, for part (a) I could see:

public Location getNextLoc(int row, int col)
{
    Location belowLoc = new Location(row + 1, col);
    Location rightLoc = new Location(row, col + 1);
    
    if(belowLoc.getRow() == grid.length)
        return rightLoc;
    
    if(rightLoc.getCol() == grid[0].length)
        return belowLoc;
    
    if(grid[belowLoc.getRow()][belowLoc.getCol()] <
            grid[rightLoc.getRow()][rightLoc.getCol()])
        return belowLoc;
    else
        return rightLoc;
}

It’s been a few months, but if I remember correctly, I used the variables to avoid the long condition. I agree the approach immediately above is clearer.

Yes, part (b) could start as you describe. My solution matches how I thought about the problem. There are also a few solutions floating around with the condition written pretty cleanly in its normal place (instead of the artificial use of null).