Форум программистов, компьютерный форум CyberForum.ru

Шахматы: определение правильности хода конем - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 5.00
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
21.04.2011, 09:31     Шахматы: определение правильности хода конем #1
Шахматы
(Время: 1 сек. Память: 16 Мб Сложность: 18%)

Шахматы Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «C7-D5», то программа должна определить это как правильный ход, если же введено «E2-E4», то ход неверный. Так же нужно проверить корректность записи ввода: если например, введено «D9-N5», то программа должна определить данную запись как ошибочную. Помогите ему осуществить эту проверку!

Входные данные

В единственной строке входного файла INPUT.TXT записан текст хода, который указал пользователь. Пользователь не может ввести строку, длиннее 5 символов.
Выходные данные

В выходной файл OUTPUT.TXT нужно вывести «YES», если указанный ход конем верный, если же запись корректна (в смысле правильности записи координат), но ход невозможен, то нужно вывести «NO». Если же координаты не определены или заданы некорректно, то вывести сообщение «ERROR».
Примеры
INPUT.TXT
1) C7-D5
2) E2-E4
3) BSN
OUTPUT.TXT
1)YES
2)NO
3)ERROR
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
int main() {
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    char a,b,z;
    char c,d;
    cin >> a >> c >> z;
    cin >> b >> d;
    if(z != '-' || ((int)a < 64 || (int)a > 73) || ((int)b < 64 || (int)b > 73) 
        || (int)c < 49 || (int)c > 56 || (int)d < 49 || (int)d > 56) {
            cout << "ERROR";
    }
    else {
        a = (int)a;
        b = (int)b;
        c = (int)c;
        d = (int)d;
        if((a - 1 == b && c + 2 == d) || (a - 1 == b && c - 2 == d) || 
            (a + 1 == b && c + 2 == d) || (a + 1 == b && c - 2 ==d )|| 
            (a - 2 == b && c + 1 == d) || (a - 2 == b && c - 1 == d) || 
            (a + 2 == b && c + 1 == d) || (a + 2 == b && b - 1 == d)) {
                cout << "YES";
        }
        else {
            cout << "NO";
        }
    }
    cout << endl;
    system("pause >> void");
    return 0;
}
На 8-м тесте проваливается.
Где может быть ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2011, 09:31     Шахматы: определение правильности хода конем
Посмотрите здесь:

2 хода конём C++
СИ++ ход конем C++
Задача Ход конем - 2. C++
Определение правильности даты Turbo CИ C++
C++ Ход конем
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.04.2011, 15:56     Шахматы: определение правильности хода конем #2
Быдлокод, но работает)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <fstream>
//#include <numeric>
#include <vector>
//#include <algorithm>
 
int f(char ch)
{
    switch(ch)
    {
        case 'A':
        case 'a':
                     return 1;
                     break;
        case 'B':
        case 'b':
                     return 2;
                     break;
        case 'C':
        case 'c':
                     return 3;
                     break;
        case 'D':
        case 'd':
                     return 4;
                     break;
        case 'E':
        case 'e':
                     return 5;
                     break;
        case 'F':
        case 'f':
                     return 6;
                     break;
        case 'G':
        case 'g':
                     return 7;
                     break;
        case 'H':
        case 'h':
                     return 8;
                     break;
        default:
                     return -1;
    }
}
 
struct T
{
    int x, y;
};
 
int main()
{
    std::ifstream ifs("INPUT.TXT");
    std::ofstream ofs("OUTPUT.TXT");
    char ch, tmp;
    T _1, _2;
 
    ifs >> ch;
    if(f(ch) == -1)
    {
        ofs << "ERROR";
        return 1;
    }
 
    _1.x = f(ch);
    ifs >> _1.y;
    if(_1.y > 8 || _1.y <= 0)
    {
        ofs << "ERROR";
        return 0;
    }
 
    ifs >> tmp;
    if(tmp != '-')
    {
        ofs << "ERROR";
        return 0;
    }
    ifs >> ch;
    if(f(ch) == -1)
    {
        ofs << "ERROR";
        return 0;
    }
 
    _2.x = f(ch);
    ifs >> _2.y;
    if(_2.y > 8 || _2.y <= 0)
    {
        ofs << "ERROR";
        return 0;
    }
 
    if(_1.x + 2 == _2.x && (_1.y + 1 == _2.y || _1.y - 1 == _2.y))
    {
        ofs << "YES";
        return 0;
    }
    else if(_1.y - 2 == _2.y && (_1.x + 1 == _2.x || _1.x - 1 == _2.x))
    {
        ofs << "YES";
        return 0;
    }
    else if(_1.x - 2 == _2.x && (_1.y + 1 == _2.y || _1.y - 1 == _2.y))
    {
        ofs << "YES";
        return 0;
    }
    else if(_1.y + 2 == _2.y && (_1.x + 1 == _2.x || _1.x - 1 == _2.x))
    {
        ofs << "YES";
        return 0;
    }
 
 
    ofs << "NO" << std::endl;
 
    return 0;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.04.2011, 16:33     Шахматы: определение правильности хода конем #3
if(z != '-' || ((int)a < 64 || (int)a > 73) || ((int)b < 64 || (int)b > 73)
|| (int)c < 49 || (int)c > 56 || (int)d < 49 || (int)d > 56) {
cout << "ERROR";
}
Перепроверьте условие для a и b
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
21.04.2011, 16:54  [ТС]     Шахматы: определение правильности хода конем #4
if(z != '-' || ((int)a < 65 || (int)a > 72) || ((int)b < 65 || (int)b > 72)
|| (int)c < 49 || (int)c > 56 || (int)d < 49 || (int)d > 56) {
cout << "ERROR";
}
valeriikozlov, не внимательно проверил =). Спасибо.
asics, и Вам спасибо =). У Вас прошло все тесты =)
HOUND
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 8
21.02.2015, 16:21     Шахматы: определение правильности хода конем #5
Здравствуйте! Ваш код выводит ошибку ERROR когда я пишу a 1 - b 3 можете помочь и обьяснить это мое дз)))
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
21.02.2015, 17:37     Шахматы: определение правильности хода конем #6
Недавно была здесь похожая задача.
Там приведено оригинальное и лаконичное решение.
Если нумеровать координаты числами (x1,y1)->(x2,y2)
То правильный ход конем удовлетворяет условию
C++
1
abs(x1-x2)*abs(y1-y2)==2
Буквенное обозначение ничего не меняет, т.к. разность кодов букв A-H
будет такая же.
Байт
21.02.2015, 20:30     Шахматы: определение правильности хода конем
  #7

Не по теме:

нам не дано предугадать, где наше слово отзовется...

Yandex
Объявления
21.02.2015, 20:30     Шахматы: определение правильности хода конем
Ответ Создать тему
Опции темы

Текущее время: 19:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru