You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组计算结果不符问题求助

问题分析与修复方案

我仔细检查了你的代码、输入数据和预期逻辑,发现了几个关键问题——既有编译层面的错误,也有导致输出不符合预期的核心逻辑问题,下面逐一说明并给出修复方案:

1. 变量作用域错误

你在if(count==0)和if(count==1)的代码块内部定义了n、m、Cost、VMs这些变量,这意味着它们的作用域仅局限于当前代码块,在循环外部和后续计算逻辑中根本无法访问。这会直接导致编译错误,你能运行的话可能是实际代码有调整,但这个问题必须优先修正——把这些变量的声明移到while循环外面。

2. 输入读取的索引逻辑错误

你的输入读取逻辑跳过了count==2的行:

  • count==0读取n,count==1读取m后,count==2应该是Cost数组的第一行,但你的代码判断条件是count>=3 && count<n+3,这就漏掉了这一行,导致Cost数组少读一行,后续VMs数组也会读取错误的行数据。

3. 核心计算逻辑错误

这是输出不符合预期的关键原因!根据你给出的计算示例,NewCost[i][j]应该基于上一行计算好的NewCost值来推导,而不是原始的Cost值:

// 你的错误代码
y = Cost[i-1][k] + Cost[i][j] + Vms[k][j];
// 正确逻辑
y = NewCost[i-1][k] + Cost[i][j] + VMs[k][j];

你误用了原始的Cost[i-1][k]而非已经优化过的NewCost[i-1][k],直接导致后续所有行的计算结果偏差。

4. 其他细节错误

  • Java大小写敏感:你定义的数组是VMs,但计算时写成了Vms,会导致找不到变量的编译错误。
  • 未声明变量y:直接使用y会触发编译错误,需要添加int y;声明。
  • 未初始化BufferedReader:br = null;直接调用br.readLine()会抛出NullPointerException,需要添加文件初始化逻辑。
  • 赋值逻辑遗漏:原代码仅在y < a时给NewCost[i][j]赋值,若所有y都不小于初始a(虽当前场景不会出现,但逻辑不严谨),会导致NewCost[i][j]保持默认值0。

修正后的完整代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CostCalculator {
    public static void main(String[] args) throws IOException {
        String path = args[0];
        BufferedReader br = new BufferedReader(new FileReader(path)); // 初始化读取流
        String line;
        int count = 0;
        // 把需要跨作用域访问的变量移到循环外声明
        int n = 0;
        int m = 0;
        int[][] Cost = null;
        int[][] VMs = null;

        while ((line = br.readLine()) != null) {
            if (count == 0) {
                n = Integer.parseInt(line.trim());
            } else if (count == 1) {
                m = Integer.parseInt(line.trim());
                Cost = new int[n][m];
                VMs = new int[m][m];
            } else if (count >= 2 && count < n + 2) { // 修正Cost数组读取起始索引
                String[] spliter = line.split("\\s+");
                for (int j = 0; j < m; j++) {
                    Cost[count - 2][j] = Integer.parseInt(spliter[j]);
                }
            } else if (count >= n + 2 && count < n + 2 + m) { // 修正VMs数组读取范围
                String[] spliter = line.split("\\s+");
                for (int k = 0; k < m; k++) {
                    VMs[count - (n + 2)][k] = Integer.parseInt(spliter[k]);
                }
            }
            count++;
        }
        br.close(); // 关闭流资源

        int[][] NewCost = new int[n][m];
        // 初始化第一行
        for (int w = 0; w < m; w++) {
            NewCost[0][w] = Cost[0][w];
        }

        // 计算后续行
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int a = 10000;
                for (int k = 0; k < m; k++) {
                    int y = NewCost[i-1][k] + Cost[i][j] + VMs[k][j]; // 修正核心计算逻辑
                    if (y < a) {
                        a = y;
                    }
                }
                NewCost[i][j] = a; // 确保每次都赋值最小值
            }
        }

        // 输出结果
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(NewCost[i][j] + " ");
            }
            System.out.println();
        }
    }
}

验证结果

用你提供的输入数据运行修正后的代码,会得到和预期完全一致的输出:

5 6 3 
12 13 8 
17 18 11 
15 20 17 

内容的提问来源于stack exchange,提问作者Chris P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:49