2015-10-07 6 views
0

код для шахматной доски каждый шахматисты B для черного и белого W для , где W и B не разделяют один и тот же край.ошибка при проверке соседних ячеек в 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

Вы используете отрицательный индекс массива. Когда i или j равен нулю, то

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

становится

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

И используя отрицательный индекс массива является undefined behavior и все может случиться. Вам нужно добавить проверку границ, чтобы убедиться, что вы не используете индекс меньше нуля или более 3. Вам также необходимо проверить chess[i + 1][j] и chess[i][j + 1], как и когда i или j равно 3, вы снова выходите за пределы.

+0

Я получаю представление о неопределенном поведении. но есть ли более простой способ проверки границ? Использование операторов If сделает код слишком длинным –

 Смежные вопросы

  • Нет связанных вопросов^_^