Учебная задачка, использовать можно только то что есть итак используется + struct(for, while, if, cin, cout)... Если у кто-то подскажет как это можно улучшить, буду благодарен.
#include<iostream>
#include<vector>
using namespace std;
/*Эта программа находит и заменяет в матрице символов все буквы совподающих
слов на заглавные и только если слова написанны сверху вниз и/или слева направо.
При компиляции использовался gcc 4.4 c параметрами -ansi -Wall -O2 -DNDEBUG -Wextra -Werror -Wno-uninitialized -Wno-sign-compare -Wshadow -o
Сначало вводится колчество слов, строк и столбцов:
1 3 4
Потом слова:
gnu
И вконце матрица:
g n u p
n n s t
u t u y
И выдаст:
G N U p
N N s t
U t U y
*/
//Эти три рекурсивные функция находят и заменяют строчные буквы на
//заглавные для всех слов из вектора v написанных сверху вниз,
//слева на права и по диагонали соответсвеннож
bool d(const string& s, vector< vector<char> >& v, int x, int y, int n) {
if (s.size() == n) return true; //если мы прошли до конца и не нашли ни одного раздичия возвращяется True
char c = v[x + n][y];
if (c < 'a') c = char(c - 'A' + 'a'); // Если символ не строчной делаю его таковым
char cc = char(c + 'A' - 'a'); //Создаю заглавный символ
if (s[n] == c and d(s, v, x, y, n+1)) { //Если текущий символ слова равен текущиму символу матрицы и тоже самое верно для следующего, то...
v[x + n][y] = cc; //Заменяю символ в матрице на заглавный
return true;
}
return false;
}
bool r(const string& s, vector< vector<char> >& v, int x, int y, int n) {
if (s.size() == n) return true;
char c = v[x][y + n];
if (c < 'a') c = char(c - 'A' + 'a');
char cc = char(c + 'A' - 'a');
if (s[n] == c and r(s, v, x, y, n+1)) {
v[x][y + n] = cc;
return true;
}
return false;
}
bool di(const string& s, vector< vector<char> >& v, int x, int y, int n) {
if (s.size() <= n) return true;
char c = v[x + n][y + n];
if (c < 'a') c = char(c - 'A' + 'a');
char cc = char(c + 'A' - 'a');
if (s[n] == c and di(s, v, x, y, n+1)) {
v[x + n][y + n] = cc;
return true;
}
return false;
}
void search(const vector<string>& w, vector< vector<char> >& v) {
for (int i = 0; i < w.size(); ++i) { //"Перелистываю" слова
for (int x = 0; x < v.size(); ++x) { //Перехожу на следующую строчку в матрице
for (int y = 0; y < v[x].size(); ++y) { //Перехожу на следующую строчку в матрице
// каждый if проверяет чтобы наш поиск не завел нас за матрицу
if ((x + w[i].size() - 1) < v.size()) d(w[i], v, x, y, 0);
if ((y + w[i].size() - 1) < v[0].size()) r(w[i], v, x, y, 0);
if ((x + w[i].size() - 1) < v.size() and (y + w[i].size() - 1) < v[0].size()) di(w[i], v, x, y, 0);
}
}
}
}
int main() {
int x, m, n;
bool first = true;
while (cin >> x >> m >> n) {
if (first) first = false;
else cout << endl;
vector<string> words(x);
for (int i = 0; i < x; ++i) cin >> words[i];
vector< vector<char> > crossword(m, vector<char> (n));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) cin >> crossword[i][j];
}
search(words, crossword);
for (int i = 0; i < m; ++i) {
cout << crossword[i][0];
for (int j = 1; j < n; ++j) cout << ' ' << crossword[i][j];
cout << endl;
}
}
}