Проверка правильности массива (C ++) - PullRequest
0 голосов
/ 02 марта 2019

Правильный массив

Давайте предположим, что у нас есть массив длиной N, состоящий из заглавных букв A, B и C. Мы называем массив «правым».array 'если между каждыми двумя буквами C, которые идут одна за другой в массиве, имеется больше букв A, чем букв B.Моя работа состоит в том, чтобы выяснить, является ли данный массив «правильным», и если да, я должен распечатать «ПРАВО», иначе я должен напечатать, для скольких частей (мест между C) данное условие не соответствует действительности (есть ещеBs than As).

Ввод : в первую строку вводится количество букв в массиве N (1 200).В следующей строке мы вводим массив без пробелов между ними.

Выход : Распечатать ответ в одну строку.

Примеры:

  • Ввод: 16 ABBCAABCACBAAACB Выход: ПРАВО

  • Вход: 15 ABBCABCACBAAACB Выход: 1

  • Вход: 14 CABCABBCBAABBC Вывод: 3

Теперь я попытался решить эту проблему, но третий пример не работает для меня - я получаю вывод 2 и, как указановыше, я должен получить 3, кроме этого - он прекрасно компилируется.

    #include <iostream>

using namespace std;

int main()
{
    int N;
    cin >> N;
    char Ar[N];
    int A = 0;
    int B = 0;
    int piece = 0;
    int attempt = 0;

    for (int i = 0; i < N; i++) {
        cin >> Ar[i];
    }

    for (int i = 0;  i < N; i++) {
        if (Ar[i] == 'C') {
            for (int j = i + 1; i < N; j++) {
                if (Ar[j] == 'A') {
                    A++;
                } else if (Ar[j] == 'B') {
                    B++;
                } else if (Ar[j] == 'C') {
                    i = j;
                    break;
                }
            }
            if (A > B) {
                piece++;
                attempt++;
            } else if (A <= B) {
                attempt++;
            }
            A = 0;
            B = 0;
        }
    }


    if (piece == attempt) {
        cout << "RIGHT";
    } else {
        cout << attempt - piece;
    }

    return 0;
}

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

Ну, вы также можете подойти к этому немного по-другому:

string str;
bool counting = false;
int counter = 0, notRightCounter = 0;

cout << "String: ";
cin >> str;                                  // user enters whole string at once 

for (char& c : str) {                        // for each char in string
    if (c == 'C') {                          // start or stop counting when C is found
        counting = !counting;
        if (!counting && counter <= 0) {     // Check if piece between Cs is right
            notRightCounter++;
            counting = !counting;
        }
        counter = 0;
        continue;                            // Continue to next char after 'C'
    }

    if (counting)                            // Keeping count of A's and B's
        switch (c) {
            case 'A':
            counter++;
            break;
        case 'B':
            counter--;
            break;
        }
}

// Print results
if (notRightCounter != 0)                   
    cout << "Not right! " << "Not right counter: " << notRightCounter;
else
    cout << "Right!";
0 голосов
/ 02 марта 2019

У вас есть несколько проблем, как указано в комментариях к коду ниже:

int N;
cin >> N;
std::vector<char> Ar(N);

for (int i = 0; i < N; i++) {
    cin >> Ar[i];
}

int piece = 0;
int attempt = 0;

for (int i = 0;  i < N - 1; i++) {
    if (Ar[i] != 'C') {
        // Skip letters until the first C
        continue;
    }
    int A = 0;
    int B = 0;
    int j = i + 1;
    for (; j < N; j++) {
        if (Ar[j] == 'A') {
            A++;
        } else if (Ar[j] == 'B') {
            B++;
        } else if (Ar[j] == 'C') {
            // We only account for blocks between Cs
            attempt++;
            if (A > B) {
                piece++;
            }
            break;
        }
    }
    // Next piece starts at j, i will be incremented by outer loop
    i = j - 1;
}
0 голосов
/ 02 марта 2019
#include <iostream>

using namespace std;

int main() {
  int numChars;
  cin >> numChars;

  char array[numChars];

  for (int i = 0; i < numChars; ++i) {
    cin >> array[i];
  }

  int numBrokenPieces = 0;
  int numAs = 0;
  int numBs = 0;

  bool inPiece = false;
  for (int i = 0; i < numChars; ++i) {
    if (array[i] == 'C') {
      if (!inPiece) {
        inPiece = true;
        continue;
      } else {
        if (numBs >= numAs) {
          ++numBrokenPieces;
        }
        numAs = 0;
        numBs = 0;
      }
    } else {
      if (inPiece) {
        if (array[i] == 'A') {
          ++numAs;
        } else if (array[i] == 'B') {
          ++numBs;
        }
      }
    }
  }

  if (numBrokenPieces == 0) {
    cout << "RIGHT";
  } else {
    cout << numBrokenPieces;
  }

  return 0;
}
0 голосов
/ 02 марта 2019

Проблема в случае

        } else if (Ar[j] == 'C') {
            i = j;
            break;
        }

, причина в том, что как только вы вернетесь к основному циклу, i будет увеличиваться, поэтому окончание C не будет считатьсяначало новой группы.Ваш код в основном проверяет каждый второй блок.

Вместо этого вы должны установить

i = j-1;

, чтобы после увеличения i был индексом C.

Кроме того, вы должны повторно инициализировать A и B в ноль при оценке раздела.

...