Остальное утверждение выполняется, даже если «утверждение If» казалось верным - PullRequest
0 голосов
/ 16 мая 2019

Проблема состоит в том, чтобы найти симметричность в матрице символов (char logo[N][N]), где logo содержит некоторые символы (только 0 или 1 ).

Обратите внимание, что при выводе кода, как только я получу все 4 элемента логотипа как 0, т.е. if(0==0==0==0), тогда также будет выполнен код else.

Я реализовалКод проверки симметрии и обнаружил, что единственная проблема возникает в данном блоке кода, где еще выполняется блок, и это дает неправильный результат (НЕТ).

фрагмент кода: (N это размер квадратной матрицы)

int YES=1;
for(j=N-1;j>((N-1)>>1);j--) /* symmetricity condition particular to the problem*/
    {
        for(k=0;k<((N-1)>>1);k++)
        {
            printf("%c %c %c %c\n",logo[j][k],logo[N-1-j][k],logo[j][N-1-k],logo[N-1-j][N-1-k]); // used this line for debugging
            if(logo[j][k]==logo[N-1-j][k]==logo[j][N-1-k]==logo[N-1-j][N-1-k])continue;   //checking symmetricity
            else  // here else is executed when all 4 logo elements are 0
            {
                YES=0;
                break;
            }
        }
    }
    (YES==1)?printf("YES\n"):printf("NO\n");

Я ожидаю, что результат будет " ДА ", так как каждый раз, когда проверяется элемент 4 логотипа, обнаруживается, что он совпадает (1111 или 0000), но здесь выможно увидеть результат NO после i получить 4 нуля.

1-я строка - это номер тестового примера, вторая строка - N, затем N * N-матрица OUTPUT :1st line is number of test case, second line is N, then N*N matrix

Вы можете видеть, когда все элементы логотипа равны 1111, затем он возвращается в цикл, но после 0000 он прерывается и печатает НЕТ.

Ответы [ 2 ]

1 голос
/ 16 мая 2019
logo[j][k]==logo[N-1-j][k]==logo[j][N-1-k]

== остается ассоциативным. Возвращает 0 или 1. Это означает, что 2-й == будет сравнивать либо 0, либо 1 с logo[j][N-1-k]. Вы не хотите этого, поэтому вам нужно вставить правильные операнды, дублируя некоторые из них и используя оператор &&.

1 голос
/ 16 мая 2019

Замените ваш оператор if следующим:

if((logo[j][k]==logo[N-1-j][k]) && 
   (logo[N-1-j][k]==logo[j][N-1-k]) &&
   (logo[j][N-1-k]==logo[N-1-j][N-1-k]))
  continue;   //checking symmetricity

Текущая реализация делает следующее:

logo[j][k]==logo[N-1-j][k] // returns TRUE
==logo[j][N-1-k]           // returns FALSE (I imagine that logo[j][N-1-k] does not equal TRUE
==logo[N-1-j][N-1-k]       // returns FALSE (I imagine that logo[N-1-j][N-1-k] does not equal FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...