В вашем коде сейчас много ошибок.
void checkMatches(int arr9[ARRAY_SIZE][ARRAY_SIZE]) // 01
{
int count = 0;
//check each row
for (int row = 0; row < ARRAY_SIZE; row++) {
int i = arr9[row][0]; // 02
for (int col = 1; col < ARRAY_SIZE; col++) {
if ( arr9[i] == arr9[i + 1]) { // 03
count++;
if (count >= 3) {
i = 0; // 04, 05
}
}
else {
count = 0;
}
}
}
//check each column
for (int col = 0; col < ARRAY_SIZE; col++) {
int i = arr9[0][col]; // 02
for (int row = 1; row < ARRAY_SIZE; row++) {
if (arr9[i] == arr9[i + 1]) { // 03
count++;
if (count > +3) {
i = 0; // 04, 05
}
}
else {
count = 0;
}
}
}
}
Я пометил проблемные c строки с помощью // xx, где xx - это номер проблемы, как показано ниже:
- Вы передаете массив без измерений. Попробуйте передать и размеры. Например:
void checkMatches(int[][] myArray, size_t xSz, size_t ySz)
Вы создаете бесполезную переменную стека. Удалите. Вы сравниваете «будущий» адрес. Это несовместимо с вашим l oop (начните с 1) и приведет к выходу за пределы допустимого диапазона. Это должно быть исправлено, чтобы использовать «прошлый» адрес:
if (arr9[row][col] == arr9[row][col - 1]) {
Вы пишете во временную переменную 'i', что не имеет смысла. Вам нужно записать в саму таблицу.
arr9[row][col] = 0;
Однако это проблема сама по себе, так как он будет записывать 0 только при третьем совпадении и будет эффективно сбрасывать счетчик, поскольку следующее сравнение будет сравниваться с только что записанным 0.
Вы записываете результаты перед выполнением второго прохода. Рассмотрим таблицу ниже:
1 2 3 4 5 6 7
2 3 4 4 4 4 6
3 2 1 4 1 2 3
Если я правильно вас понял, вам нужно следующее:
1 2 3 0 5 6 7
2 3 0 0 0 0 6
3 2 1 0 1 2 3
Это означает, что вы должны записывать адреса по мере чтения и выполнять обновления в конце.
Вот псевдокод, переписанный для вашего метода. Я использовал обозначение кортежа C# для краткости:
void checkMatches(int[][] arr9, size_t ySz, size_t xSz) // 01
{
std::vector<(y, x)> lst; // a vector of some type of tuple structure.
int count = 0;
//check each row
for (size_t row = 0; row < ySz; row++)
{
for (size_t col = 1; col < xSz; col++)
{
if ( arr9[row][col] != arr9[row][col - 1])
{
if (count > 3)
{
size_t cl = col - 1;
while (count-- > 0)
{
lst.push_back(row, cl--);
}
}
else
{
count = 0;
}
}
else
{
count++;
}
}
if (count > 3)
{
size_t cl = xSz - 1;
while (count-- > 0)
{
lst.push_back(row, cl--);
}
}
}
// check each column
// TODO: apply the above code to check columns this time. I won't copy/paste here, you can do that. Keep adding to lst.
// Update the table.
for ((size_t, size_t) xy : lst)
{
arr9[xy.y][xy.x] = 0;
}
}