Подсчет строковой фразы в String Grid - PullRequest
0 голосов
/ 21 мая 2019

Вам дана сетка n * m, которая содержит строчные английские буквы. Сколько раз фраза «саба» появляется в сетке по горизонтали, вертикали и диагонали?

Подсчет по горизонтали, вертикали и диагонали.

#include<iostream> 
#include <vector>
#include <string>
using namespace std;
int TotalCount(vector<string> Str, int ItemCount)
{
string Text = "saba";
string VerticalString = "";
string DiagonalOneString = "";
string DiagonalTwoString = "";
int count = 0;
for (int i = 0; i < ItemCount; ++i)
{
    string& currentRow = Str[i];
    VerticalString = VerticalString.append(&currentRow.at(0));
    DiagonalOneString = DiagonalOneString.append(&currentRow.at(i));
    DiagonalTwoString = 
    DiagonalTwoString.append(&currentRow.at(currentRow.length() - 1 - i));

    if ((currentRow.find(Text) != string::npos) || (VerticalString.find(Text) != string::npos) || (DiagonalOneString.find(Text) != string::npos) || (DiagonalTwoString.find(Text) != string::npos))
    {
        count++;
    }
}
return count;
}

int main()
{
int total = 0;
int row;
cin >> row;
vector<string> rows;
// read each row and append to the "rows" vector
for (int r = 0; r < row; r++)
{
    string line;
    cin >> line;
    rows.push_back(line);
}
cout << TotalCount(rows, row);
return 0;
}

Формат ввода

Первая строка: два целых числа n и m, где n обозначает (1 <= n, m <= 100) количество строк, а m обозначает количество столбцов в сетке. Следующие n строк: каждая строка должна содержать строку длиной m, которая содержит только строчные английские буквы </p>

Sample Input
5 5
safer
amjad
babol
aaron
songs

Expected Output
2

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

1 Ответ

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

Когда ваша вертикальная строка равна saba, count будет увеличиваться.Но count будет увеличиваться снова, когда ваша вертикальная строка равна sabas, для того же самого удара.

Кроме того, вы, вероятно, намеревались искать диагонали помимо только двух между углами.Просмотр только 2 диагоналей дает возможность пропустить действительные попадания.И, вероятно, требуется чтение обоих направлений.

Моя рекомендация состояла бы в том, чтобы разбить задачу на подсчет совпадений из каждого горизонтального ряда, подсчет совпадений из каждого вертикального ряда (можно транспонировать матрицу и повторно использовать первую функцию)подсчет диагоналей (с северо-востока на юго-запад) и, наконец, подсчет диагоналей (с северо-запада на юго-восток).То есть, назначьте для каждого из них новую функцию и суммируйте результаты.

Печать тестируемых строк также очень поможет при отладке.

...