-2

我被困在从文本文件中读取二维数组中,但我做不到。我有您在代码中看到的 tri[][] 数组数据。我需要从文本中读取它,而不是在程序中定义。然后我将这些数据插入到程序中。

在此处输入图像描述

代码:

// C++ program for Dynamic
// Programming implementation of
// Max sum problem in a triangle 
#include<bits/stdc++.h>
using namespace std;
#define N 4
int sumRec[N];
bool checkPrimeNumber(int n)
{
    //cout << n;
    bool flag = true;
    for(int a = 2; a <= n/2; ++a)
    {
      if(n%a == 0)
      {
          flag = false;
      }
    }
    //if number is 1 return false. 1 is not prime
    if(n == 1)
        flag = false;
    return flag;
}


int maxPathSum(int tri[][N], int row, int col, int sum)
{
    bool isPrime = checkPrimeNumber(tri[row][col]);
    if(isPrime == true){
        //Do nothing..
    }
    else if(row + 1 >= N){
        sum = sum + tri[row][col];
     if(sumRec[col]<sum)
         sumRec[col]= sum;  
    }
    else{
        sum = sum + tri[row][col];
        maxPathSum(tri, row + 1, col, sum);
        maxPathSum(tri, row + 1, col + 1, sum);
    }
}

int main()
{
   int maxSum = 0;
   int tri[N][N] = {  {1, 0, 0, 0},
                      {8, 4, 0, 0},
                      {2, 6, 9, 0},
                      {8, 5, 9, 3}};

   maxPathSum(tri, 0, 0, 0);

    for (int i=0; i < N ; i++)
    {
        if(sumRec[i] >= maxSum)
            maxSum = sumRec[i];
    }
    cout << maxSum;
   return 0;
}
4

1 回答 1

1

假设您事先知道 N,它并不太复杂:

int tri[N][N]
ifstream ifs("yourfile.dat");
for (size_t i=0; i < N; i ++)
  for (size_t j=0; j < N; j++) 
    ifs >> tri[i][j];

这种(简单)方法适用于以下形状的文件,换行符和空格分隔标记。N=5 的文件如下所示:

1 2 3 4 5
2 3 4 5 6 
3 1 4 2 5
6 2 4 2 1
6 2 3 4 5

关于您的后续评论:以非常相同的方式读取三角矩阵是可能的。如前所述,该软件读取由空格、制表符、换行符或类似内容分隔的任何整数序列,并且不关心除此之外的格式。事实上,你可以有一个三角形文件或其他任何东西。然而,对于三角矩阵,二维数组可能不是最佳存储...

具体来说:对于文件中的三角矩阵,根据您期望的数字更改 for,例如

for(i=0; i<N; i++) 
  for j=0; j <=i; j++) 
     cin >> tri[i][j];

大致会这样做:外部的 for 超出预期的线,内部的第一个为 1,第二个为 2,依此类推。但是,您也可以添加一个

tri[j][i] = tri[i][j]; 

到循环,以便用对角矩阵制成的对称矩阵填充方形存储空间的两侧。

仍然建议明确定义您的文件格式和内存存储概念,以便编写一个解析器,该解析器对于格式和形状不正确的文件可能会失败。

于 2018-03-27T13:41:53.223 回答