Rozwiązałem sobie zadanie 6 z dzisiejszej matury z informatyki. Nie zakładam, że rozwiązania są poprawne, więc proszę się nimi nie sugerować. Wyniki się zgadzają z plikiem przyklad.txt. Link do arkusza: http://p.iplsc.com/-/0006KMT9RH3XK1EY.pdf . Link do plików tekstowych (automatycznie pojawi się informacja o pobieraniu) http://plikicke.cie.men.gov.pl/_EGZAMIN_MATURALNY/2017/FORMULA_OD_2015/informatyka/Dane_PR2.zip
W razie błędów proszę pisać, będę poprawiał. Ostatni podpunkt rozdzieliłem na 2 wątki, ze względu na jego słabą wydajność i długi czas wykonania.
Odpowiedzi które mi wyszły:
zad 6.1 - 221 oraz 7
zad 6.2 - 149
zad 6.3 - 753
zad 6.4 - 5
#include <iostream>
#include <future>
#include <thread>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <utility>
using namespace std;
size_t first_func(vector<vector<int>> &mapa, size_t start, size_t end);
int main() {
fstream file;
file.open("dane.txt", ios_base::in);
vector<vector<int>> mapa;
for (size_t i = 0; i < 200; i++) {
vector<int> row;
mapa.push_back(row);
}
int temp;
for (size_t row = 0; row < 200; ++row) {
for (size_t col = 0; col < 320; ++col) {
file >> temp;
mapa[row].push_back(temp);
}
}
file.close();
//---------------------------------------------------------------------
int max = mapa[0][0];
int min = mapa[0][0];
for (auto &vec : mapa) {
for (auto &element : vec) {
if (element < min)
min = element;
if (element > max)
max = element;
}
}
cout << "max: " << max << endl;
cout << "min: " << min << endl;
//---------------------------------------------------------------------
int counts = 0;
for (size_t row = 0; row < 200; ++row) {
for (size_t col = 0; col < 160; ++col) {
if (mapa[row][col] != mapa[row][319 - col]) {
counts++;
break;
}
}
}
cout << "Najmniejsza liczba wierszy: " << counts << endl;
//----------------------------------------------------------------------
vector<pair<int, int>> cords;
int counts_kontr = 0;
for (size_t row = 0; row < 200; ++row) {
for (size_t col = 0; col < 319; ++col) {
if(abs(mapa[row][col] - mapa[row][col + 1]) > 128) {
cords.push_back(make_pair(row, col));
cords.push_back(make_pair(row, col + 1));
}
}
}
for (size_t row = 0; row < 199; ++row) {
for (size_t col = 0; col < 320; ++col) {
if (abs(mapa[row][col] - mapa[row + 1][col]) > 128) {
cords.push_back(make_pair(row, col));
cords.push_back(make_pair(row + 1, col));
}
}
}
for (size_t row = 199; row > 0; --row) {
for (size_t col = 319; col > 1; --col) {
if (abs(mapa[row][col] - mapa[row][col - 1]) > 128) {
cords.push_back(make_pair(row, col));
cords.push_back(make_pair(row, col - 1));
}
}
}
for (size_t row = 199; row > 1; --row) {
for (size_t col = 319; col > 0; --col) {
if (abs(mapa[row][col] - mapa[row - 1][col]) > 128) {
cords.push_back(make_pair(row, col));
cords.push_back(make_pair(row - 1, col));
}
}
}
sort(cords.begin(), cords.end());
auto unique_iterator = unique(cords.begin(), cords.end());
cords.erase(unique_iterator, cords.end());
cout << "kontrastujacych: " << cords.size() << endl;
//-----------------------------------------------------------------------
future<size_t> f1 = async(launch::async, first_func, mapa, 0, 160);
future<size_t> f2 = async(launch::async, first_func, mapa, 160, 320);
size_t first_result = f1.get();
size_t second_result = f2.get();
if (first_result < second_result)
cout << "Najdluzsza linia pionowa: " << second_result << endl;
else
cout << "Najdluzsza linia pionowa: " << first_result << endl;
cin.get();
}
size_t first_func(vector<vector<int>> &mapa, size_t start, size_t end) {
vector<int> vec_col;
size_t max_val = 0;
size_t temp_val;
for (size_t col = start; col < end; ++col) {
for (size_t row = 0; row < 199; ++row) {
if (mapa[row][col] == mapa[row + 1][col]) {
vec_col.push_back(row);
vec_col.push_back(row + 1);
}
else {
sort(vec_col.begin(), vec_col.end());
auto unique_iter = unique(vec_col.begin(), vec_col.end());
vec_col.erase(unique_iter, vec_col.end());
temp_val = vec_col.size();
if (temp_val > max_val)
max_val = temp_val;
vec_col.clear();
}
}
}
return max_val;
}