2011-04-18 86 views
1

有人可以請說明爲什麼我得到下面的錯誤與下面的代碼?超出內存或無效內存參考 - C++錯誤

Execution error: Your program had this runtime error: 
     Exceeded memory or invalid memory reference. The program ran for 
     0.000 CPU seconds before the error. It used 3048 KB of memory. 
    ------ Data ------ 
    7 4 
    11 6 11 6 3 10 6 
    7 9 6 13 5 15 5 
    1 10 12 7 13 7 5 
    13 11 10 8 10 12 13 
    ---------------------------- 

代碼:

#include <iostream> 
#include <fstream> 
#include <string.h> 
using namespace std; 
int castle[50][50]; 
int components[50][50]; 
bool visited[50][50]; 
int N, M; 

void flood(int y, int x, int component) { 
    if(visited[y][x]) return; 
    visited[y][x] = true; 
    components[y][x] = component; 
    if(x>0 && !((castle[y][x] & 1) == 1)) { //West 
     cout<<"castle["<<y<<"]["<<x<<"] just"; 
     cout<<"flooded west\n"; 
     flood(y, x-1, component); 
    } 
    if(y>0 && !((castle[y][x] & 2) == 2)) { //North 
     cout<<"castle["<<y<<"]["<<x<<"] just"; 
     cout<<"flooded north\n"; 
     flood(y-1, x, component); 
    } 
    if(x<M && !((castle[y][x] & 4) == 4)) { //East 
     cout<<"castle["<<y<<"]["<<x<<"] just"; 
     cout<<"flooded east\n"; 
     flood(y, x+1, component); 
    } 
    if(y<N && !((castle[y][x] & 8) == 8)) { //South 
     cout<<"castle["<<y<<"]["<<x<<"] just"; 
     cout<<"flooded south\n"; 
     flood(y+1, x, component); 
    } 
} 

int main() { 
    ifstream inp("castle.in"); 
    ofstream out("castle.out"); 
    memset(components, -2, sizeof(components)); 
    memset(visited, false, sizeof(visited)); 
    inp >> M >> N; 
    for(int y=0; y<N; y++) { 
     for(int x=0; x<M; x++) { 
      inp >> castle[y][x]; 
     } 
    } 

    int curComponent = 0; 
    for(int y=0; y<N; y++) { 
     for(int x=0; x<M; x++) { 
      if(visited[y][x]) continue; 
      flood(y,x,++curComponent); //first component will be 1 
//   cout << "curComponent = " << curComponent <<"\n"; 
     } 
    } 
    int roomAreas[curComponent+2]; //need an extra one since curComponent actually starts at 1 
    memset(roomAreas, 0, sizeof(roomAreas)); 
    int greatestArea = 0; 
    for(int y=0; y<N; y++) { 
     for(int x=0; x<M; x++) { 
      cout << "components[" << y <<"][" << x <<"] = " << components[y][x] << "\n"; 
      roomAreas[components[y][x]]++; 
      if(roomAreas[components[y][x]] > greatestArea) greatestArea = roomAreas[components[y][x]]; 
     } 
    } 
    int greatestCombined = 0, bestx=0, besty=0; 
    char bestDir='N'; //Means none -> error 
    for(int y=0; y<N; y++) { 
     for(int x=0; x<M; x++) { 
     /* 
      if(x>0 && components[y][x] != components[y][x-1] && roomAreas[components[y][x]] + roomAreas[components[y][x-1]] > greatestCombined) { //West 
       greatestCombined = roomAreas[components[y][x]] + roomAreas[components[y][x-1]]; 
       bestx = x; 
       besty = y; 
       bestDir = 'W'; 
      } 
     */ 
      if(y>0 && components[y][x] != components[y-1][x] && roomAreas[components[y][x]] + roomAreas[components[y-1][x]] > greatestCombined) { //North 
       greatestCombined = roomAreas[components[y][x]] + roomAreas[components[y-1][x]]; 
       bestx = x; 
       besty = y; 
       bestDir = 'N'; 
      } 
      if(x<M && components[y][x] != components[y][x+1] && roomAreas[components[y][x]] + roomAreas[components[y][x+1]] > greatestCombined) { //East 
       greatestCombined = roomAreas[components[y][x]] + roomAreas[components[y][x+1]]; 
       bestx = x; 
       besty = y; 
       bestDir = 'E'; 
      } 
     /*   
      if(y<N && components[y][x] != components[y+1][x] && roomAreas[components[y][x]] + roomAreas[components[y+1][x]] > greatestCombined) { //South 
       greatestCombined = roomAreas[components[y][x]] + roomAreas[components[y+1][x]]; 
       bestx = x; 
       besty = y; 
       bestDir = 'S'; 
      } 
     */ 
     } 
    } 
    out << curComponent << "\n" << greatestArea << "\n" << greatestCombined << "\n" << besty+1 << " " << bestx+1 << " " << bestDir << "\n"; 
    return 0; 
} 

非常感謝!

回答

1

可能

if(x<M && ... 

應該是

if(x<M-1 && ... 

由於在該部分,它可以遞歸淹沒(X + 1)。這可能意味着x的傳遞等於M,它溢出到東部的邊界。

同樣爲y氾濫南檢查。

+0

剛剛做了這個和y相同,但我仍然得到相同的錯誤 – joshim5 2011-04-18 01:25:54

+0

至少這是代碼中的一個真正的錯誤。 – 2011-04-18 01:27:44

+1

有一些問題在線'if(x 最大合併){//東' – 2011-04-18 01:28:49