代码是国际象棋棋盘每个西洋棋棋子B
为黑色,W
为白色
,W
和B
不应共享相同的边缘。
示例:
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 :(得分: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
或{{ 1}}等于3你再次走出界限。