diff --git a/2sem/programming basics/19/100.cpp b/2sem/programming basics/19/100.cpp new file mode 100644 index 0000000..960211b --- /dev/null +++ b/2sem/programming basics/19/100.cpp @@ -0,0 +1,128 @@ +// pb_19_100.cpp +// Горбацевич Андрей +#include +#include +#include +#include + +using namespace std; + +struct point { + int x,y; +}; +struct field { + int field[8][8] = {}; +}; + +void print_mtx(field&); +void traverse(point at, field&); +void draw_shortest(point at, field&); + +auto comparePoints = [](const point &a, const point &b) +{ + return (a.x < b.x) || (a.y < b.y); +}; +set visited; + +char i2f(int p) { + if (p < 0 || p > 8) { + throw out_of_range("char should be in a..h"); + } + return char(int('a') + p); +} +int f2i(char _c) { + char c = char(tolower(_c)); + if (c < 'a' || c > 'h') { + throw out_of_range("char should be in a..h"); + } + return (c % 'a'); +} + +bool pif(point p) { + return ((p.x < 8) && (p.x >= 0)) && ((p.y < 8) && (p.y >= 0)); +} + +int main() { + cout << "Enter starting point (e.g. c3) >>>"; + point pos{}; + char xe; + cin >> xe; + pos.x = f2i(xe); + cin >> pos.y; + pos.y -= 1; + if (pos.y < 0 || pos.y >= 8) { + throw out_of_range("y pos should be in 1..8"); + } + + cout << "Enter end point (e.g. c3) >>>"; + point end{}; + cin >> xe; + end.x = f2i(xe); + cin >> end.y; + end.y -= 1; + if (end.y < 0 || end.y >= 8) { + throw out_of_range("y pos should be in 1..8"); + } + + field f; + f.field[pos.x][pos.y] = 1; + //print_mtx(f); + traverse(pos, f); + //print_mtx(f); + cout << "It takes " << f.field[end.x][end.y] << " steps to get here (inc. first pos.)." << endl; + cout << "Possible route: "; + draw_shortest(end, f); + cout << i2f(end.x) << end.y+1; + + return 0; +} + +void print_mtx(field &f) { + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + cout << f.field[i][j] << " "; + } + cout << endl; + } + cout << endl; +} + +void traverse(point at, field &f) { + vector pts = { + {at.x+1, at.y-2}, {at.x+2, at.y-1}, + {at.x+2, at.y+1}, {at.x+1, at.y+2}, + {at.x-1, at.y+2}, {at.x-2, at.y+1}, + {at.x-2, at.y-1}, {at.x-1, at.y-2}, + }; + + for (auto pt : pts) { + if (!pif(pt) || f.field[pt.x][pt.y] != 0) { + continue; + } + f.field[pt.x][pt.y] = f.field[at.x][at.y] + 1; + } + for (auto pt : pts) { + if (!pif(pt) || f.field[pt.x][pt.y] != f.field[at.x][at.y]+1) { + continue; + } + traverse(pt, f); + } +} + +void draw_shortest(point at, field &f) { + vector pts = { + {at.x+1, at.y-2}, {at.x+2, at.y-1}, + {at.x+2, at.y+1}, {at.x+1, at.y+2}, + {at.x-1, at.y+2}, {at.x-2, at.y+1}, + {at.x-2, at.y-1}, {at.x-1, at.y-2}, + }; + + for (auto pt : pts) { + if (!pif(pt) || f.field[pt.x][pt.y] != f.field[at.x][at.y]-1) { + continue; + } + draw_shortest(pt, f); + cout << i2f(pt.x) << pt.y+1 << " -> "; + break; + } +}