Вам дана сетка 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(¤tRow.at(0));
DiagonalOneString = DiagonalOneString.append(¤tRow.at(i));
DiagonalTwoString =
DiagonalTwoString.append(¤tRow.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, содержащую только строчные латинские буквы.
Sample Input
5 5
safer
amjad
babol
aaron
songs
Expected Output
2
Кажется, что VerticalString копирует всю строку вместо копирования символа в указанной позиции. Я не получаю ожидаемого количества. Может, пожалуйста, кто-нибудь, дайте мне знать, почему счет идет неправильно?
Да, извините, я совсем забыл об этом. Спасибо! :-)





Когда ваша вертикальная строка равна saba, count будет увеличиваться. Но count будет снова увеличиваться, когда ваша вертикальная строка равна sabas, для того же попадания.
Кроме того, вы, вероятно, имели в виду поиск диагоналей, кроме двух между углами. Рассмотрение только двух диагоналей позволяет не заметить действительные попадания. И чтение в обоих направлениях, вероятно, требуется.
Я бы рекомендовал разбить задачу на подсчет попаданий в каждую горизонтальную строку, подсчет попаданий в каждую вертикальную строку (можно переставить матрицу и повторно использовать первую функцию), подсчет диагоналей (с северо-востока на юго-запад) и, наконец, подсчет диагоналей ( с северо-запада на юго-восток). То есть выделить новую функцию для каждого из них и просуммировать результаты.
Печать строк, которые вы тестируете, также очень поможет вам при отладке.
Не имеет отношения к вашей проблеме, но вы знаете, что количество элементов в векторе находится в самом векторе? И что его можно получить, например.
Str.size()? Это означает, что вам не нужно передавать размер вектора в качестве аргумента для ваших вызовов функций.