【问题标题】:Find the max sum path from bottom left side to top right cell找到从左下角到右上角单元格的最大和路径
【发布时间】:2015-09-19 11:37:17
【问题描述】:

我必须在给定的 2d Array(n,m) 中找到最大和路径,其值从 0 到 99999。0 表示墙。我们没有从数组的左下角开始,必须到达右上单元格(0,m-1)。您可以上/下/右,并且可以访问每个单元格一次。下面是没有任何块的代码。我的问题是我不能从左下角移动到右上角单元格。我还创建了左数组(主数组的最左边),以便我可以从可能的最佳值开始。对不起,我不是好程序员:)。

代码

 public static int  maxvalue(int [][]field,int[] left)
 {
      for(int i=field.length-1;i>0 && left[i]!=-1;i--)
      {

           System.out.println( "Startpos "+i+" 0");
           int distance =max(i,0,field,0,field.length-1);
           if(distance>maxvalue)
               maxvalue=distance;
      }
     return maxvalue;
 }
 public static int  max(int r, int c,int [][]field ,int destR, int destC)
 {

       if(r>destR|| c>destC)
           return 0;
      if(r==0 && c==field[0].length)
     return  field[r][c];
      int sum1=max(r-1,c,field,destR,destC); // up
      System.out.println(sum1);
      int sum2= max(r+1,c,field,destR,destC);          //down
      int sum3=  max(r,c+1,field,destR,destC);         //right
      return field[r][c]+Math.max(sum1, Math.max(sum2, sum3));
 }

样本

输入

0 1 2 3

2 0 2 4

3 3 0 3

4 2 1 2

输出

25

如何解决这个问题?如果所有路径都被阻塞,则打印 No Solution。

【问题讨论】:

  • 您能否分享您的代码,以便我们了解您的尝试以及您遇到的问题?
  • "You can go up/down/top" up 和 top 有什么区别?你能走对吗?你可以向左走吗?
  • 我投票决定将此问题作为题外话结束,因为它是一个家庭作业问题,其中不包括迄今为止为解决该问题所做的工作的必要摘要,也不包括对解决时遇到的困难。
  • 我想你可能想看看en.wikipedia.org/wiki/A*_search_algorithm

标签: java algorithm solution


【解决方案1】:

你有没有第一次尝试自己解决?

这看起来有点工作,但并非不可能。

我会使用 3 个 int 变量:xPosition、yPosition 和 Sum;

继续并优先测试 xPosition+1、yPosition-1 的值,然后测试其余的值(因为您想达到xPosition == array.length - 1 && yPosition == 0。)如果您找到 0,请测试其他可能性并排除您的可能性已经过去了。

每次找到好的路径时,将单元格的值添加到总和中。

一旦你被阻止,将其重置为 0。

【讨论】:

  • 我在从单元格的左下角移动到右上角时遇到问题。一开始我没有积木。
  • 编辑您的主要问题并输入您已经生成的代码。
【解决方案2】:

对于数组中的每个元素,您必须找到相邻元素的最大值并检查边界条件。希望这段代码对你有所帮助。

public class StackOverFlow {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    int n = in.nextInt();
    int m = in.nextInt();
    Integer [][] array = new Integer[n][m];
    boolean [][] visited = new boolean[n][m];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            array[i][j] = in.nextInt();
        }
    }

    int i = n-1, j =0;
    visited[i][j] = true;
    int sum = array[i][j];
    while(true)
    {

        int max = -1;
        int maxi = 0, maxj = 0;
        if(i-1 >= 0 && i-1<= n-1 && j>=0 && j<= m-1 && array[i-1][j] != null && array[i-1][j]>max && !visited[i-1][j])
        {
            max = array[i-1][j];
            maxi = i-1;
            maxj=j;
        }
        if(i+1 >= 0 && i+1<= n-1 && j>=0 && j<= m-1 &&array[i+1][j] != null  && array[i+1][j]>max && !visited[i+1][j])
        {
            max = array[i+1][j];
            maxi = i+1;
            maxj=j;
        }

        if(i >= 0 && i<= n-1 && j-1>=0 && j-1<= m-1 && array[i][j-1] != null  && array[i][j-1]>max && !visited[i][j-1])
        {
            max = array[i][j-1];
            maxi = i;
            maxj=j-1;
        }

        if(i >= 0 && i<= n-1 && j+1>=0 && j+1<= m-1 && array[i][j+1] != null  && array[i][j+1]>max && !visited[i][j+1])
        {
            max = array[i][j+1];
            maxi = i;
            maxj=j+1;
        }

        i = maxi;
        j = maxj;
        visited[i][j] = true;
        sum += max;

        if(i == 0 && j == m-1)
            break;
    }
    System.out.println(sum);

}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2019-09-17
    • 2013-12-22
    相关资源
    最近更新 更多