Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement