Миша и негатив — Двумерные массивы
Миша и негатив
Миша недавно научился фотографировать и начал заниматься программированием. Одной из его первых программ стало создание негатива бинарного черно-белого изображения.
Бинарное черно-белое изображение представляет собой прямоугольник, состоящий из черных и белых пикселей. Негатив такого изображения получается путем замены черных пикселей на белые и наоборот.
Однако, программа Миши работает с ошибками, и сгенерированный негатив может отличаться от правильного. Чтобы выяснить, сколько пикселей в негативе ошибочны, Миша решил написать тестовую программу.
Программа должна считать исходное черно-белое изображение и сгенерированный негатив, затем определить количество пикселей, которые были неправильно инвертированы.
Входные данные
Входной файл INPUT.TXT содержит числа n и m (1 ≤ n, m ≤ 100) – высоту и ширину изображения. Далее следуют n строк по m символов («B» или «W»), описывающих исходное изображение. После пустой строки идет описание негатива в том же формате.
Выходные данные
В выходной файл OUTPUT.TXT нужно вывести количество пикселей, которые были неправильно инвертированы.
Тестовые примеры
№ |
INPUT.TXT |
OUTPUT.TXT |
1 |
4 4
WBWB
BWBW
WBWB
BWBWBBBB
WBWB
BWBW
WBWB |
2 |
2 |
4 4
WBWB
BWBW
WBWB
BWBWBWBW
WBWB
BWBW
WBWB |
0 |
3 |
4 4
WWWW
WWWW
WWWW
WWWWWBBW
BBBB
BBBB
BBBW |
3 |
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { ifstream inputFile("INPUT.TXT"); // Открытие входного файла ofstream outputFile("OUTPUT.TXT"); // Открытие выходного файла if (!inputFile.is_open()) { cerr << "Не удалось открыть входной файл!" << endl; // Ошибка открытия файла return 1; } int n, m; inputFile >> n >> m; // Чтение размеров изображения inputFile.ignore(); // Игнорирование символа новой строки vector<string> originalImage(n); for (int i = 0; i < n; ++i) { getline(inputFile, originalImage[i]); // Чтение строк оригинального изображения } // Чтение пустой строки перед негативным изображением string emptyLine; getline(inputFile, emptyLine); vector<string> negativeImage(n); for (int i = 0; i < n; ++i) { getline(inputFile, negativeImage[i]); // Чтение строк негативного изображения } inputFile.close(); // Закрытие входного файла // Подсчет ошибок int errorCount = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (originalImage[i][j] == 'B' && negativeImage[i][j] != 'W') { ++errorCount; // Ошибка: черный пиксель не инвертирован в белый } else if (originalImage[i][j] == 'W' && negativeImage[i][j] != 'B') { ++errorCount; // Ошибка: белый пиксель не инвертирован в черный } } } outputFile << errorCount << endl; // Запись количества ошибок в выходной файл outputFile.close(); // Закрытие выходного файла return 0; } |
Объяснение кода на C++
Этот код выполняет следующие шаги:
- Открытие входного файла
INPUT.TXT
для чтения и выходного файла OUTPUT.TXT
для записи.
|
ifstream inputFile("INPUT.TXT"); // Открытие входного файла ofstream outputFile("OUTPUT.TXT"); // Открытие выходного файла |
- Проверка успешного открытия входного файла. Если файл не открылся, выводится сообщение об ошибке.
|
if (!inputFile.is_open()) { cerr << "Не удалось открыть входной файл!" << endl; // Ошибка открытия файла return 1; } |
- Чтение размеров изображения
n
и m
из входного файла.
|
int n, m; inputFile >> n >> m; // Чтение размеров изображения inputFile.ignore(); // Игнорирование символа новой строки |
- Чтение строк оригинального изображения из входного файла в вектор
originalImage
.
|
vector originalImage(n); for (int i = 0; i < n; ++i) { getline(inputFile, originalImage[i]); // Чтение строк оригинального изображения } |
- Чтение пустой строки перед негативным изображением.
|
string emptyLine; getline(inputFile, emptyLine); // Чтение пустой строки перед негативным изображением |
- Чтение строк негативного изображения из входного файла в вектор
negativeImage
.
|
vector negativeImage(n); for (int i = 0; i < n; ++i) { getline(inputFile, negativeImage[i]); // Чтение строк негативного изображения } |
- Закрытие входного файла после чтения всех данных.
|
inputFile.close(); // Закрытие входного файла |
- Подсчет ошибок инвертирования пикселей, где черный пиксель не стал белым и белый пиксель не стал черным.
|
int errorCount = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (originalImage[i][j] == 'B' && negativeImage[i][j] != 'W') { ++errorCount; // Ошибка: черный пиксель не инвертирован в белый } else if (originalImage[i][j] == 'W' && negativeImage[i][j] != 'B') { ++errorCount; // Ошибка: белый пиксель не инвертирован в черный } } } |
- Запись количества ошибок в выходной файл
OUTPUT.TXT
.
|
outputFile << errorCount << endl; // Запись количества ошибок в выходной файл outputFile.close(); // Закрытие выходного файла |