Loading...
Filipbg avatar Filipbg 26 Точки

Проблем с четенето на 2D масив - 01. Compare Matrices

#include<iostream>
#include <vector>
using namespace std;

bool isEqual = -1;
int main()
{
    int first2DArrayRows = 0;
    int first2DArrayCols = 0;
    int second2DArrayRows = 0;
    int second2DArrayCols = 0;
    cin >> first2DArrayRows >> first2DArrayCols;
    vector< vector<int> > first2DArray(first2DArrayRows, vector<int>(first2DArrayCols));
    for(int row = 0; row < first2DArrayRows; ++row)
        for(int col = 0; col < first2DArrayCols; ++col)
        {
            cin >> first2DArray[row][col];
            first2DArray[row].push_back(col);
        }

    cin >> second2DArrayRows >> second2DArrayCols;
    vector< vector<int> > second2DArray(second2DArrayRows, vector<int>(second2DArrayCols));
    for(int row = 0; row < second2DArrayRows; ++row)
        for (int col = 0; col < second2DArrayCols; ++col)
        {
            cin >> second2DArray[row][col];
            second2DArray[row].push_back(col);
        }

    if(first2DArray != second2DArray)
        isEqual = 0;
    else
        isEqual = 1;
    if(isEqual)
        cout << "equal" << endl;
    else
        cout << "not equal" << endl;
    return 0;
}

От вчера се мъча да разгадая защо не ми ги чете като хората. Гледах пак лекцията, гледах демата, четох форуми и не схващам какво не е наред.

Тагове:
0
C++ Fundamentals
AlexanderHr avatar AlexanderHr 18 Точки
Best Answer

В условието те не ти дават колко колони ще има матрицата, ако гледаме същата задача. Тоест ти трябва да прочетеш реда и да го запишеш в vector-a без да знаеш неговата дължина. Едно трикче е да го прочетеш като стринг и да запишеш него вместо числата, които се съдържат в него. Ето ти моя код. Питай ако не разбираш нещо!

#include <vector>
#include <iostream>
using namespace std;
int main(){
  int rows;
  cin >> rows;
  cin.ignore();
  vector<string> V(rows), V2(rows);
  for(int i = 0; i < rows; i++)
    getline(cin,V[i]);
  cin >> rows;
  cin.ignore();
  if(rows==V.size())
    for(int i = 0; i < rows; i++)
      getline(cin,V2[i]);
  cout << (V == V2? "equal":"not equal") << endl;
}

Още нещо, което е малко странно в твоя код, е че ти още първоначално казваш колко голям ще ти е динамичния масив, но после push_back-ваш още елементи с този ред:

first2DArray[row].push_back(col);

И то добавяш текущата колона, което няма много смисъл.

0
Filipbg avatar Filipbg 26 Точки

Не се бях сетил, че мога да използвам по-малко променливи. Също така незнаех, че може да се реши с вектор от стрингове. Не разбирам причината за проверката if(rows==V.size()) данеби условието на задачата да има предвид, че масивите са еднакви? Но само пише "two integer matrices (2D arrays) from the console" не пише two equal. Аз мислех че дължината им може да варира. И накрая начина по който изчисляваш дали са равни (V == V2? "equal":"not equal") предполагам, че по този начин казваш на cout сам да си ги сравни и реши кое да принтира? Благодаря за обяснението.

0
AlexanderHr avatar AlexanderHr 18 Точки

Понеже input-а изглежда така:

rows за матрица 1

после ни въвеждат матрица 1

rows за матрица 2

после ни въвеждат матрица 2

Ако rows за матрица 1 и rows за матрица 2 се различават, то нама как матрица 1 и матрица 2 да са еднакви.

Понеже вече съм въвел матрица 1 и знам колко реда има тя, то мога да преизползвам rows променливата. После проверявам дали V.size()  (rows за матрица 1) == rows ( нововъведения брой на редовете за матрица 2). Ако те не са равни, то няма смисъл да се въвежда матрица 2, защото ние вече знаем че те ще се различават поне с един цял ред.

(V == V2? "equal":"not equal")  представлява така наречения Ternary operator.

Basically ако матрица 1 е равна на матрица 2(?) тогава "equal", иначе(:) "not equal". Това всичкото e еквивалентно на:

if(V==V2){
  cout << "equal" << endl;
}
else{
  cout << "not equal" << endl;
}

 

0
Filipbg avatar Filipbg 26 Точки

Аха. Ясно. Така се затвърждава логиката без да се правят прекалено много проверки и да се разширява кода. Nice! 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.