[2sem] pb19 done
This commit is contained in:
parent
22397f0a2f
commit
678fad6333
1 changed files with 128 additions and 0 deletions
128
2sem/programming basics/19/100.cpp
Normal file
128
2sem/programming basics/19/100.cpp
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
// pb_19_100.cpp
|
||||
// Горбацевич Андрей
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
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<point, decltype(comparePoints)> 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<point> 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<point> 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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue