2015-10-07 1 views
0

le code est à échiquier chaque jeu d'échecs B pour le noir et blanc W pour , où W et B ne doit pas partager le même bord.erreur lors de la vérification des cellules adjacentes dans la matrice 2d

Exemple:

WBWB 
BWBW 
WBWB 
BWBW 

Mon code est:

#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; 
} 

Le problème est que lorsque je lance ce code, la sortie est:

WBWB 
BWBW 
BBWB 
WBBW 

Je débogués et chess[2][-1] égaux à W, il est hors de portée, donc c'est supposé être une poubelle.

Répondre

0

Vous utilisez un index de tableau négatif. Lorsque i ou j est égal à zéro alors

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

devient

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

Et en utilisant un index de tableau négatif est undefined behavior et tout peut arriver. Vous devez ajouter des bornes de vérification pour vous assurer que vous n'utilisez pas un index inférieur à zéro ou supérieur à 3. Vous devez également vérifier chess[i + 1][j] et chess[i][j + 1] comme lorsque i ou j équivaut à 3, vous sortez à nouveau des limites.

+0

J'ai l'idée du comportement indéfini. mais y a-t-il un moyen plus simple de vérifier les limites? L'utilisation de Si les instructions rendront le code trop long –