возьмите матрицу 4*4 у пользователя, чтобы проверить, содержит ли она 2*2 подматрицы, имеющие одинаковое значение

#c

Вопрос:

мне просто нужно, чтобы пользователь ввел матрицу символов 4*4, вывод будет » да » или » нет » в зависимости от того, есть ли подматрица 2 * 2 с одинаковым входом. код всегда печатается ложным.

код такой:

 #include <iostream>
using namespace std;
int main()
{
    //input
    char color[4][4];
    for (int i = 0; i < 4; i  ) {
        for (int j = 0; j < 4; j  ) {
            cin >> color[i][j];
        }
    }
    
    //for testing if there are a squar  
    // * * * *
    // * * # #
    // # # * *
    // * * # #
    
    // 'yes' as
    // * * 
    // * *
    // is a squar of 2*2
    for (int i = 0; i < 4; i  ) {
        for (int j = 0; j < 4; j  ) {
            if (j != 3) {
                if (color[i][j] == color[i][j   1] == color[i   1][j] == color[i   1][j   1]) {
                    cout << "yes";
                    break;
                }
                else cout << "no";
            }
        }
    }

    //for (int i = 0; i < 4; i  ) {
        //for (int j = 0; j < 4; j  ) {
            //if (j == 3)
                //cout << colors[i][j] <<"n";
            //else
            //cout << colors[i][j];
        //}
    //}
    return 0;
}
 

Комментарии:

1. Похоже, вам, возможно, потребуется научиться использовать отладчик для пошагового выполнения кода. С хорошим отладчиком вы можете выполнять свою программу построчно и видеть, где она отклоняется от того, что вы ожидаете. Это необходимый инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке

2. a == b == c == d не делает того, что вы думаете. Это интерпретируется как ((a == b) == c) == d , что означает, что вы сравниваете промежуточный результат ( true или false ) с char

Ответ №1:

Это условие неверно:

 if (color[i][j] == color[i][j   1] == color[i   1][j] == color[i   1][j   1]
 

Для простоты рассмотрим

 if (a == b == c) 
 

который анализируется как

 if ( (a == b) == c)
 

Результат a==b сравнивается с c . Результатом a==b является либо true или false , которое может быть преобразовано в 1 или 0 , соответственно.

Вы бы "yes" напечатали на экране , когда есть подматрица 2×2 со всеми элементами, равными 1 , хотя это было бы по неправильным причинам.

Чего вы на самом деле хотите, так это:

 if ( a==b amp;amp; a==c)
 

Не игнорируйте предупреждения ваших компиляторов! При наличии правильных флагов ваш код не компилируется: https://godbolt.org/z/45oqcTEna.

Более того, цикл выходит за пределы массива. Вы предотвращаете j выход за пределы, но когда i == 3 затем color[i 1][j] пытаетесь получить доступ к элементу, которого не существует. Вместо итерации до <4 и затем исключения j == 3 , пусть цикл повторяет только те индексы, которые являются допустимыми верхними левыми углами подматрицы:

 const size_t size = 4;
const size_t sub_matrix_size = 1;
for (size_t i=0; i < size-sub_matrix_size;   i) {
     for (size_t j=0; j < size-sub_matrix_size;   j) {
        //...