Симметричная матрица в C ++ - PullRequest
0 голосов
/ 20 апреля 2019

Проверка, является ли 2D-матрица симметричной или нет. Задача - вывести ДА, если матрица симметричная, иначе вывести НЕТ.

Я не получаю ожидаемый результат.Может кто-нибудь, пожалуйста, помогите мне и, пожалуйста, дайте мне знать, что не так с этим кодом

#include<iostream>
#include<vector>
using namespace std;
bool rev(int n)
{
int n1,d,rn=0;
n1=n;
while(n>0)
{
        d=n%10;
    rn=(rn*10)+d;
    n/=10;
}
if(n1==rn)
{return true;}
else
return false;
 }
 bool XAxisSymCheck(vector<int> vect)
 {
      // Declaring iterator to a vector 
    vector<int>::iterator ptr; 
    for (ptr = vect.begin(); ptr < vect.end(); ptr++) 
     { if(!rev(*ptr)) // reversing the elements in each element of vector to check whether its symmetric or not .. similar to palindrome
         {
            return false;
         }
     }
  }
  int main()
  {int testcase;
  cin>>testcase;
  for(int k=0;k<testcase;++k)
  {vector<int> rows;
  bool IsSymmetric=true;
  int row;
    cin >> row;
    // read each row and append to the "rows" vector
    for (int r = 0; r < row; r++)
    {
        int line;
        cin >> line;
        rows.push_back(line);
    }
   if(XAxisSymCheck(rows))
   {int i,j;
   i=0;
   j=row-1;
   while(i<j) // looping through the elements of vector and checking the first element with last element , second element with the second last element and so on.
    {
     if(rows[i]!=rows[j])
       {
         IsSymmetric=false;
         break;
       }
     i++;
     j--;
    }
   }
   else
    {
     IsSymmetric=false;
    }   
    cout << (IsSymmetric ? "Yes" : "No") << endl;
 }  
return 0;
}

Входные данные: Первая строка содержит T - количество тестовых случаев.Т-тесты следуют.Первая строка каждого теста содержит N - размер матрицы.Следующие N строк содержат двоичные строки длиной N.

Выходные данные: Вывести YES или NO в новой строке для каждого теста

SAMPLE INPUT 
5
2
11
11
4
0101
0110
0110
0101
4
1001
0000
0000
1001
5
01110
01010
10001
01010
01110
5
00100
01010
10001
01010
01110

SAMPLE OUTPUT 
YES
NO
YES
YES
NO

Test Case #1: Symmetric about both axes, so YES.

Test Case #2: Symmetric about X-axis but not symmetric about Y-axis, so NO.

Test Case #3: Symmetric about both axes, so YES.

Test Case #4 and #5 are explained in statement.

1 Ответ

1 голос
/ 20 апреля 2019

Есть три проблемы с вашим кодом

1) Вы никогда не вернете true из XAxisSymCheck (это легко обнаружить, просмотрев предупреждения компилятора, например, g++ -Wall matrix.cpp)

bool XAxisSymCheck(vector<int> vect) {
    vector<int>::iterator ptr; 
    for (ptr = vect.begin(); ptr < vect.end(); ptr++) { 
        if(!rev(*ptr, vect.size()))
            return false;

    }
    return true;
}

2) Когда ваш XAxisSymCheck не срабатывает, вы не устанавливаете IsSymmetric в false (по крайней мере, в исходном сообщении до редактирования)

for(int k=0;k<testcase;++k) {
    vector<int> rows;
    bool IsSymmetric = true;

    // ....

    if (XAsxisSymCheck(rows)) {
       // ...
    } else {
        IsSymmetric = false;
    }

    cout << (IsSymmetric ? "Yes" : "No") << endl;
}

3) Ваша обратная проверка не пройдена, если в строке есть начальные нули, потому что обратная частота недостаточно умножается на 10.

bool rev(int n,int len) {
    int n1,d,rn=0;
    n1=n;
    for (int i = 0; i < len; i++)
    {
        d=n%10;
        rn=(rn*10)+d;
        n/=10;
    }
    return n1==rn;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...