1 - моделью 2 - меньше информации 3 - глобус, макет здания, муляж яблока, манекен 4 - рисунок, фотография 5 - знаковой 6 - смешанной 7 - автомобиль — техническое описание автомобиля, город — путеводитель по городу 8 - существенные признаки объекта-оригинала 9 - разные модели объекта 10 - физическая карта, график зависимости расстояния от времени, схема узора для вязания крючком, схема метро 11 - словесное описание, формула 12 - знаковой 13 - смешанной 14 - болт — чертеж болта, мелодия — нотная запись мелодии
for (auto& i : field){ i.H = 'a' + distribution(generator) - 1; i.V = distribution(generator); } }
// Поиск возможных комбинаций для хода. std::vector<Notation> SearchMoves(const Notation& stroke){ std::vector<Notation> temp; int x, y;
for (int i = 0; i < 8; ++i){ switch (i){ case 0: // Вверх влево. y = +3; x = -1; break; case 1: // Вверх вправо. y = +3; x = +1; break; case 2: // Вправо вверх. y = +1; x = +3; break; case 3: // Вправо вниз. y = -1; x = +3; break; case 4: // Вниз вправо. y = -3; x = +1; break; case 5: // Вниз влево. y = -3; x = -1; break; case 6: // Влево вниз. y = -1; x = -3; break; case 7: // Влево вверх. y = +1; x = -3; break; } // Если ход возможен, добавим его в массив. if (CheckMov(stroke, x, y)) temp.push_back(Notation{ stroke.H + x, stroke.V + y }); } return std::vector<Notation>(temp); }
// Проверка выхода за границу. bool CheckMov(const Notation& stroke, int x, int y){ bool isLTBorder = (stroke.H + x >= 'a') && (stroke.V + y >= 1); bool isRBBorder = (stroke.H + x <= 'h') && (stroke.V + y <= 8); return (isLTBorder && isRBBorder); }
// Все возможные ходы одного элемента. std::vector<Notation> temp = SearchMoves(*field.begin()); for (auto i = field.begin() + 1; i < field.end(); ++i){ for (auto u : temp){ // Ход в массиве - есть ход конём. if (u == *i) { possible.push_back(u); break; } } temp = SearchMoves(*i); }
return std::vector<Notation>(possible); }
// Выводит массив в поток. std::ostream& PrintGround(const std::vector<Notation>& field, std::ostream& out){ for (auto i : field) out << i.H << i.V << " - "; return out; }
2 - меньше информации
3 - глобус, макет здания, муляж яблока, манекен
4 - рисунок, фотография
5 - знаковой
6 - смешанной
7 - автомобиль — техническое описание автомобиля, город — путеводитель по городу
8 - существенные признаки объекта-оригинала
9 - разные модели объекта
10 - физическая карта, график зависимости расстояния от времени, схема узора для вязания крючком, схема метро
11 - словесное описание, формула
12 - знаковой
13 - смешанной
14 - болт — чертеж болта, мелодия — нотная запись мелодии
В прикреплённом файле с нормальным форматированием.
#include <iostream>
#include <random>
#include <vector>
#include <algorithm>
// Описывает шахматную нотацию.
struct Notation;
// Заполняет массив случайными шахматными ходами.
void FillField(std::vector<Notation>&);
// Поиск в массиве комбинаций "ход конём".
std::vector<Notation> SearchMoves(const std::vector<Notation>&);
// Поиск возможных комбинаций для хода.
std::vector<Notation> SearchMoves(const Notation&);
// Проверка выхода за границу.
bool CheckMov(const Notation&, int, int);
// Выводит массив в поток.
std::ostream& PrintGround(const std::vector<Notation>&, std::ostream& = std::cout);
int main()
{
std::vector<Notation> field(100);
// Заполняем поле.
FillField(field);
// Выводим исходный массив.
PrintGround(field, std::cout) << std::endl;
// Поиск комбинаций "ход конём".
std::vector<Notation> fieldMovs = SearchMoves(field);
// Выводим полученный массив.
PrintGround(fieldMovs, std::cout) << std::endl;
// Отсортируем оба массива в порядке возрастания.
std::sort(field.begin(), field.end());
std::sort(fieldMovs.begin(), fieldMovs.end());
// Выводим полученные массивы.
PrintGround(field, std::cout) << std::endl;
PrintGround(fieldMovs, std::cout) << std::endl;
return 0;
}
// Описывает шахматную нотацию.
struct Notation{
unsigned char H;
unsigned int V;
bool operator==(const Notation& rhs) const{ return ((rhs.H == H) && (rhs.V == V)); }
bool operator<(const Notation& rhs) const{ return ((rhs.H < H) || ((rhs.H == H) && (rhs.V < V))); }
};
// Заполняет массив случайными шахматными ходами.
void FillField(std::vector<Notation>& field){
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1, 8);
for (auto& i : field){
i.H = 'a' + distribution(generator) - 1;
i.V = distribution(generator);
}
}
// Поиск возможных комбинаций для хода.
std::vector<Notation> SearchMoves(const Notation& stroke){
std::vector<Notation> temp;
int x, y;
for (int i = 0; i < 8; ++i){
switch (i){
case 0: // Вверх влево.
y = +3; x = -1;
break;
case 1: // Вверх вправо.
y = +3; x = +1;
break;
case 2: // Вправо вверх.
y = +1; x = +3;
break;
case 3: // Вправо вниз.
y = -1; x = +3;
break;
case 4: // Вниз вправо.
y = -3; x = +1;
break;
case 5: // Вниз влево.
y = -3; x = -1;
break;
case 6: // Влево вниз.
y = -1; x = -3;
break;
case 7: // Влево вверх.
y = +1; x = -3;
break;
}
// Если ход возможен, добавим его в массив.
if (CheckMov(stroke, x, y))
temp.push_back(Notation{ stroke.H + x, stroke.V + y });
}
return std::vector<Notation>(temp);
}
// Проверка выхода за границу.
bool CheckMov(const Notation& stroke, int x, int y){
bool isLTBorder = (stroke.H + x >= 'a') && (stroke.V + y >= 1);
bool isRBBorder = (stroke.H + x <= 'h') && (stroke.V + y <= 8);
return (isLTBorder && isRBBorder);
}
// Поиск в массиве комбинаций "ход конём".
std::vector<Notation> SearchMoves(const std::vector<Notation>& field){
std::vector<Notation> possible;
// Все возможные ходы одного элемента.
std::vector<Notation> temp = SearchMoves(*field.begin());
for (auto i = field.begin() + 1; i < field.end(); ++i){
for (auto u : temp){
// Ход в массиве - есть ход конём.
if (u == *i) {
possible.push_back(u);
break;
}
}
temp = SearchMoves(*i);
}
return std::vector<Notation>(possible);
}
// Выводит массив в поток.
std::ostream& PrintGround(const std::vector<Notation>& field, std::ostream& out){
for (auto i : field)
out << i.H << i.V << " - ";
return out;
}