为什么程序因错误而被破坏:exc_bad_access code = exc_i386_gpflt

时间:2015-04-02 18:44:57

标签: c++ algorithm

我不明白,为什么我的程序因此行exc_bad_access code=exc_i386_gpflt中的错误matrix[row].push_back(cell);而被破坏?

所以,我的代码:

#include <iostream>
#include <string>
#include <vector>

int calculate(int cell_1x1_price, int cell_1x2_price) {
  if ((cell_1x1_price + cell_1x1_price) < cell_1x2_price) {
    return cell_1x1_price + cell_1x1_price;
  } else {
    return cell_1x2_price;
  }
}

int main() {

  using std::cin;
  using std::cout;
  using std::string;
  using std::vector;

  int rows;
  int columns;
  int cell_1x2_price;
  int cell_1x1_price;

  cin >> rows >> columns >> cell_1x2_price >> cell_1x1_price;

  vector<string> matrix;
  matrix.reserve(rows);

  char cell;

  for (int row = 0; row < rows; ++row) {
    for (int column = 0; column < columns; ++column) {
      cin >> cell;
      matrix[row].push_back(cell);
    }
  }

  int sum = 0;

  for (int row = 0; row < rows; ++row) {
    for (int column = 0; column < columns; ++column) {
      if (matrix[row][column] == '*') {
        if (column + 1 < columns && matrix[row][column + 1] == '*') {
          sum += calculate(cell_1x1_price, cell_1x2_price);
          ++column;
          continue;
        }
        if (row + 1 < rows && matrix[row + 1][column] == '*') {
          matrix[row + 1][column] = '.';
          sum += calculate(cell_1x1_price, cell_1x2_price);
          continue;
        }

        sum += cell_1x1_price;
      }
    }
  }

  cout << sum;

  return 0;
}

关于程序和输入的内容:第一个字符串包括4个整数:N,M,A,B(1≤N,M≤300,A,B≤1000)。每个下一行包括M符号。符号。是一个干净的细胞,*和**很脏。

如果A的总和为**,B为*的总和,我需要找到清理总和。

1 个答案:

答案 0 :(得分:1)

这是因为当矩阵实际上是一个空向量时,你调用matrix [row]。

对matrix.reserve(rows)的调用只会增加vector的容量,它不会向它添加任何元素。你可以使用matrix.resize(rows),或者只是将大小传递给vector的构造函数,比如

vector<string> matrix(rows);