检查2d数组中的相邻单元格时出错

时间:2015-10-07 14:15:46

标签: c++ implementation similarity

代码是国际象棋棋盘每个西洋棋棋子B为黑色,W为白色 ,WB不应共享相同的边缘。

示例:

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,它超出了范围,所以它应该是垃圾。

1 个答案:

答案 0 :(得分:0)

您正在使用负数组索引。当ij为零时

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或{{ 1}}等于3你再次走出界限。