Я создал программу на c ++, которая принимает файл и морфинг для применения к нему через командную строку. Но так далеко. Мой алгоритм принимает в файл как:
.............
.............
..XXX.....X..
..XXX.....X..
..XXX........
..XXX........
..XXXXXXX....
..XXXXXXX....
..XXXXXXX....
.............
.............
и распечатывает что-то похожее на это:
.............
..X.X.....X..
.XXXXX...XXX.
..XXX.....X..
.XXXXX.......
..XXX.X.X....
.XXXXXXXXX...
..XXXXXXX....
.XXXXXXXXX...
..X.X.X.X....
.............
Когда нужно распечатать что-то похожее на это:
.............
..XXX.....X..
.XXXXX...XXX.
.XXXXX...XXX.
.XXXXX....X..
.XXXXXXXX....
.XXXXXXXXX...
.XXXXXXXXX...
.XXXXXXXXX...
..XXXXXXX....
.............
Я заставил свою программу пройти через все индексы и проверить, является ли их элемент, который они хотят расширить, затем посмотреть сверху, снизу, слева и справа. Добавить еще одну копию своего индекса в окружающую сетку. Но почему моя программа печатается так?
Вот код, который у меня есть:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
for (vector<char> &v : vec) // reference to innver vector
{
replace(v.begin(), v.end(), oldd, neww); // standard library algorithm
}
}
void dialationn(vector<vector<char>> &vec, char suspect, char n)
{
for (int i = 0; i < vec.size(); i ++) {
for (int j = 0; j < vec[i].size(); j++) {
if (vec[i][j] == suspect) {
if (i > 0) {
vec[i-1][j] = n;
}
if (j > 0) {
vec[i][j-1] = n;
}
if (i + 1<vec.size()) {
vec[i+1][j] = n;
}
if (j + 1<vec[i].size()) {
vec[i][j+1] = n;
}
}
}
}
replacee(vec, n, suspect);
}
void erode(vector<vector<char>> &vec, char suspect, char n)
{
for (int i = 0; i < vec.size(); i ++) {
for (int j = 0; j < vec[i].size(); j++) {
if (vec[i][j] == suspect) {
if (i > 0) {
vec[i-1][j] = n;
}
if (j > 0) {
vec[i][j-1] = n;
}
if (i + 1<vec.size()) {
vec[i+1][j] = n;
}
if (j + 1<vec[i].size()) {
vec[i][j+1] = n;
}
}
}
}
replacee(vec, n, suspect);
}
int main(int argc, char* argv[]) {
fstream fin; char ch;
string name (argv[1]); //File Name.
vector<vector<char>> data;
// 2D Vector.
vector<char> temp;
// Temporary vector to be pushed
// into vec, since its a vector of vectors.
fin.open(name.c_str(),ios::in);
// Assume name as an arbitary file.
string argument2 (argv[2]);
while(fin)
{
ch = fin.get();
if(ch!='\n') {
temp.push_back(ch);
}
else
{
data.push_back(temp);
temp.clear();
}
}
if (argument2 == "replace") {
string argument4 (argv[4]);
string argument3 (argv[3]);
replacee(data, argument3[0], argument4[0]);
for (int i = 0; i < data.size(); i ++) {
for (int j = 0; j < data[i].size(); j++) {
cout << data[i][j];
}
cout << endl;
}
}
if (argument2 == "dialate") {
string argument3 (argv[3]);
dialationn(data, argument3[0], 'i');
for (int m = 0; m < data.size(); m ++) {
for (int n = 0; n < data[m].size(); n++) {
cout << data[m][n];
}
cout << endl;
}
}
fin.close();
}
Основная функция принимает первый аргумент в качестве имени текстового файла для его анализа. Затем он просматривает второй аргумент, чтобы увидеть, что пользователь хочет сделать, а затем, основываясь на аргументе 2, вызывает соответствующую функцию replacee
или dialate
для применения морфа. После того, как символ *, содержащий файл, был изменен одной из функций, он выводит его на печать.
Примечание: функция dialatee
заменяет все символы, которые она считает нужными, на 'i', а затем вызывает функцию replacee
, чтобы вернуть их в исходный вывод. Это сделано для того, чтобы функция не могла прочитать уже измененные символы и применить непреднамеренные изменения.