Миша и негатив — Двумерные массивы
Миша и негатив
Миша недавно научился фотографировать и начал заниматься программированием. Одной из его первых программ стало создание негатива бинарного черно-белого изображения.
Бинарное черно-белое изображение представляет собой прямоугольник, состоящий из черных и белых пикселей. Негатив такого изображения получается путем замены черных пикселей на белые и наоборот.
Однако, программа Миши работает с ошибками, и сгенерированный негатив может отличаться от правильного. Чтобы выяснить, сколько пикселей в негативе ошибочны, Миша решил написать тестовую программу.
Программа должна считать исходное черно-белое изображение и сгенерированный негатив, затем определить количество пикселей, которые были неправильно инвертированы.
Входные данные
Входной файл 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для записи.
12ifstream inputFile("INPUT.TXT"); // Открытие входного файлаofstream outputFile("OUTPUT.TXT"); // Открытие выходного файла - Проверка успешного открытия входного файла. Если файл не открылся, выводится сообщение об ошибке.
1234if (!inputFile.is_open()) {cerr << "Не удалось открыть входной файл!" << endl; // Ошибка открытия файлаreturn 1;} - Чтение размеров изображения
nиmиз входного файла.
123int n, m;inputFile >> n >> m; // Чтение размеров изображенияinputFile.ignore(); // Игнорирование символа новой строки - Чтение строк оригинального изображения из входного файла в вектор
originalImage.
1234vector originalImage(n);for (int i = 0; i < n; ++i) {getline(inputFile, originalImage[i]); // Чтение строк оригинального изображения} - Чтение пустой строки перед негативным изображением.
12string emptyLine;getline(inputFile, emptyLine); // Чтение пустой строки перед негативным изображением - Чтение строк негативного изображения из входного файла в вектор
negativeImage.
1234vector negativeImage(n);for (int i = 0; i < n; ++i) {getline(inputFile, negativeImage[i]); // Чтение строк негативного изображения} - Закрытие входного файла после чтения всех данных.
1inputFile.close(); // Закрытие входного файла - Подсчет ошибок инвертирования пикселей, где черный пиксель не стал белым и белый пиксель не стал черным.
12345678910int 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.
12outputFile << errorCount << endl; // Запись количества ошибок в выходной файлoutputFile.close(); // Закрытие выходного файла