ЧТО Я ДЕЛАЮ НЕ ТАК? С++ ДАЮ 100 БАЛЛОВ
Ход коня
Шахматный конь ходит буквой “Г” — на две клетки по вертикали в любом направлении и на одну клетку по горизонтали, или наоборот. Даны две различные клетки шахматной доски, определите, может ли конь попасть с первой клетки на вторую одним ходом.
Входные данные
Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки.
Выходные данные
Программа должна вывести YES, если из первой клетки ходом коня можно попасть во вторую, или NO в противном случае.
Примеры
Ввод
2
4
3
2
Вывод
YES
Ввод
1
1
1
4
Вывод
NO
ЧТО Я ДЕЛАЮ НЕ ТАК???
#include
using namespace std;
int main() {
int a,b,c, d;
cin>>a>>b>>c>>d;
if(a<0){
a = -a;
if (b<0){
b = -b;
}
if (c<0){
c=-c;
}
if (d<0){
d=-d;
}
}
if ((c==a+1&&d==b+2)|| (c == a+2 && d == b-1) || (c == a + 1 && d == b - 2) || (c == a - 1 && d == b - 2) || (c == a-2 && d == b - 1) || (c == a - 2 && d == b+1) || (c==a+1&&d==b+2) || (c==a-1&&d==b+2)){
cout << "YES";
}
else{
cout << "NO";
}
return 0;
}
Ответы
1) бессмысленные действия после ввода координат: во входных данных четко прописано, что инпут валидный. Да и идея вот так "чинить" инпут, в целом, плохая. На будущее.
2)
if ((c==a+1&&d==b+2)|| (c == a+2 && d == b-1) || (c == a + 1 && d == b - 2) || (c == a - 1 && d == b - 2) || (c == a-2 && d == b - 1) || (c == a - 2 && d == b+1) || (c==a+1&&d==b+2) || (c==a-1&&d==b+2))
повторяешься в условии, не обрабатывая один случай: (c == a + 2 && d == b + 1)
Ну и бонусом за 50 баллов, как бы решал я:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
void solve(){
pair<int, int> p1, p2;
cin >> p1.first >> p1.second; // first point coordinates {x1; y1}
cin >> p2.first >> p2.second; // second point coordinates {x2; y2}
vector<int> steps = {-2, -1, 1, 2}; // possible moves
set<pair<int, int>> can; // set of points we can achieve
can.insert(p1); // put in the set initial state
for(auto &i: steps){
for(auto &j: steps){
if(abs(i) != abs(j)){ // handle non-suitable moves like {2;2} or {1;-1}
can.insert({p1.first + i, p1.second + j}); // put "moved" point in the set
}
}
}
(can.find(p2) == can.end()) ? cout << "NO" : cout << "YES"; // check if our point in the set of possible points
}
int main(){
solve();
}
попробуй c == a + 1 && d == b + 2 поменять на c == a + 1 && b - 2