Предмет: Информатика, автор: klimkinadaria

ЧТО Я ДЕЛАЮ НЕ ТАК? С++ ДАЮ 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;
}

Ответы

Автор ответа: stglupa
1

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();

}

Приложения:

klimkinadaria: СПАСИБО БОЛЬШОЕ!!!!
stglupa: обращайся )
Автор ответа: pukokaku
0

попробуй c == a + 1 && d == b + 2 поменять  на c == a + 1 && b - 2

Похожие вопросы