2015-10-07 111 views
0

檢查相鄰小區的代碼爲棋盤每個棋子B黑色和W爲白色 ,其中WB不應共享相同的邊緣。錯誤而在2D陣列

例子:

WBWB 
BWBW 
WBWB 
BWBW 

我的代碼是:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int n, m; 
    cin >> n >> m; 
    char chess[4][4]; 
    for (int i = 0;i<n;i++) 
     for (int j = 0;j<m;j++) 
      cin >> chess[i][j]; 

    for (int i = 0;i<n;i++) 
     for (int j = 0;j<m;j++) 
     { 
      if (chess[i][j] == '.') 
      { 
       if (chess[i - 1][j] == 'W' || chess[i + 1][j] == 'W' || chess[i][j + 1] == 'W' || chess[i][j - 1] == 'W') 
        chess[i][j] = 'B'; 
       else 
        chess[i][j] = 'W'; 
      } 
     } 
    for (int i = 0;i<n;i++) 
    { 

     for (int j = 0;j<m;j++) 
      cout << chess[i][j]; 
     cout << endl; 
    } 
    system("pause"); 
    return 0; 
} 

的問題是,當我運行這段代碼的輸出是:

WBWB 
BWBW 
BBWB 
WBBW 

我調試它,並chess[2][-1]平等到W,它超出了範圍,所以它應該是垃圾。

回答

0

您正在使用負數組索引。當ij是零,那麼

chess[i - 1][j] 
// and 
chess[i][j - 1] 

變得

chess[-1][j] 
// and 
chess[i][-1] 

,並且使用負數組索引undefined behavior和什麼都可能發生。您需要添加邊界檢查以確保您沒有使用小於零或大於3的索引.YOu還需要檢查chess[i + 1][j]chess[i][j + 1],因爲當ij等於3時,您再次出界。

+0

我明白了未定義的行爲。但有沒有更容易的方法來進行邊界檢查? 使用If語句會使代碼太長 –