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

Шахматы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
16.02.2010, 01:34     Шахматы #1
Помогите пожалуйста разобраться с задачкой..

Даны натуральные числа k,l,m,n. Необходимо выяснить, угрожает ли конь, стоящий на поле (k,l) шахматной доски, полю (m,n) ?

Добавлено через 43 минуты
с этой разобрался...

можете такую пояснить?

Найти все натуральные числа, не превосходящие заданного n, десятичная запись которых есть строго возрастающая или строго убывающая последовательность цифр.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2010, 01:34     Шахматы
Посмотрите здесь:

C++ Шахматы
шахматы C++
Шахматы C++
игра шахматы C++
C++ Шахматы, конь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
16.02.2010, 02:17     Шахматы #2
все ch такие, что ch < n, n є N
к примеру n = 100000, ch = 12345 - строго возрастающее или ch = 54321 - убывающее
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
16.02.2010, 03:11     Шахматы #3
Цитата Сообщение от inferno mf Посмотреть сообщение
можете такую пояснить?
Найти все натуральные числа, не превосходящие заданного n, десятичная запись которых есть строго возрастающая или строго убывающая последовательность цифр.
Сам недавно решал такую задачу. Строго возрастающая - все цифры в числе должны образовывать неубывающую последовательность (например, 1245). Вот собственно код:
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
#include <iostream>
using namespace std;
 
bool seq(int n)
{
    if(n<10)
        return true;
    unsigned long val=n%10;
    n=n/10;
    while(n)
    {
        unsigned long temp=n%10;
        if(temp>=val)
            return false;
        val=temp;
        n=n/10;
    }
    return true;
}
        
int main()
{
    setlocale(LC_ALL, "Russian");
 
    unsigned long n;
 
    do
    {
        cout << "Введите натуральное число N" << endl;
        cin >> n;
    }
    while(n<1);
    cout << endl;
    do
    {
        if(seq(n))
            cout << n << endl;
    }
    while(--n);
 
    system("pause");
    return 0;
}
Для строго убывающей последовательности поменяй условие в строке 13.

Добавлено через 42 минуты
То же самое, с использованием строк:
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
#include <iostream>
using namespace std;
 
int slen(const char* str)
{
    int n=0;
    while(*str++)
        n++;
    return n;
}
 
bool seq(char s[11])
{
    if(slen(s)==1)
        return true;
    while(*++s)
        if((int)*(s-1)>=(int)*s)
            return false;
    return true;
}
        
int main()
{
    setlocale(LC_ALL, "Russian");
 
    unsigned long n;
    char str[11];
 
    do
    {
        cout << "Введите натуральное число N" << endl;
        cin >> n;
    }
    while(n<1);
    cout << endl;
    do
    {
        itoa(n, str, 10); 
        if(seq(str))
            cout << str << endl;
    }
    while(--n);
 
    system("pause");
    return 0;
}
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
01.03.2010, 22:11  [ТС]     Шахматы #4
это на C++ ? что-то не очень понимаю как это можно записать на С...
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
01.03.2010, 22:31     Шахматы #5
inferno mf, в данном коде нету специфических контейнеров из C++, поэтому можете просто заменить ввод/вывод и все
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
02.03.2010, 15:05     Шахматы #6
inferno mf, нашел довольно изящное решение задачи про коня, не удержался от соблазна его показать
C
1
2
3
4
5
6
7
8
9
10
11
12
 for(s=0; s<8; s++) {
    if (s&1) x = 1;
    else     x = 2;
    y = 3 - x;
    if (s&2) x = -x;
    if (s&4) y = -y;
    if (k+x==mm && l+y==n) {
        printf("Am!\n");
        break;
    }
}
if (s==8) printf("Fig\n");
s - битовая шкала
1 бит - шаг по x (1 or 2)
2-3 биты - управление знаками
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
02.03.2010, 17:30  [ТС]     Шахматы #7
Цитата Сообщение от Day Посмотреть сообщение
inferno mf, нашел довольно изящное решение задачи про коня, не удержался от соблазна его показать
Код
 for(s=0; s<8; s++) {
    if (s&1) x = 1;
    else     x = 2;
    y = 3 - x;
    if (s&2) x = -x;
    if (s&4) y = -y;
    if (k+x==mm && l+y==n) {
        printf("Am!\n");
        break;
    }
}
if (s==8) printf("Fig\n");
s - битовая шкала
1 бит - шаг по x (1 or 2)
2-3 биты - управление знаками
Спасибо. Можете подсказать по тому коду, редактировал, но есть ошибки...
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
02.03.2010, 20:58     Шахматы #8
нашел довольно изящное решение задачи про коня
Это изящное решение ?

Изящное - это вот такое:
int dx= abs(k-m), dy= abs(l-n);
printf( "%s\n", ((dx==1 && dy==2) || (dx==2 && dy==1)) ? "YES" : "NO" );
inferno mf
1 / 1 / 0
Регистрация: 13.09.2009
Сообщений: 96
05.03.2010, 00:35  [ТС]     Шахматы #9
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
#include <iostream>
using namespace std;
 
bool seq(int n)
{
        if(n<10)
                return true;
        unsigned long val=n%10;
        n=n/10;
        while(n)
        {
                unsigned long temp=n%10;
                if(temp>=val)
                        return false;
                val=temp;
                n=n/10;
        }
        return true;
}
                
int main()
{
        setlocale(LC_ALL, "Russian");
 
        unsigned long n;
 
        do
        {
                cout << "Введите натуральное число N" << endl;
                cin >> n;
        }
        while(n<1);
        cout << endl;
        do
        {
                if(seq(n))
                        cout << n << endl;
        }
        while(--n);
 
        system("pause");
        return 0;
}
под С этот код не работает((

есть непонятные конструкции(
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
05.03.2010, 01:20     Шахматы #10
#include <stdio.h>
убери using namespace
замени cin>>; на scanf(); и cout<<; на printf();
endl это \n
и для system вроде stdlib.h подключить нужно
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
10.03.2010, 10:48     Шахматы #11
А можно еще так:
Код
int dx= abs(k-m), dy= abs(l-n);
printf( "%s\n", ((dx + dy)==3 && (dx*dy)!=0) ? "YES" : "NO" );
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
10.03.2010, 12:37     Шахматы #12
Код не наглядный получается и не очевидный.
А вообще сначала я думал так написать:
int dx= abs(k-m), dy= abs(l-n);
printf( "%s\n", (dx*dy==2) ? "YES" : "NO" );
Добавлено через 1 минуту
Два последних случая нехороши тем, что при больших dx и dy величина dx*dy может превысить int.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
10.03.2010, 17:32     Шахматы #13
Цитата Сообщение от odip Посмотреть сообщение
Код не наглядный получается и не очевидный.
А вообще сначала я думал так написать:


Добавлено через 1 минуту
Два последних случая нехороши тем, что при больших dx и dy величина dx*dy может превысить int.
Здорово!
А по поводу превышения int, так она еще раньше может превыситься в вычитаниях, и если есть такое подозрение, надо сразу переходить на длинную арифметику, но и это в общем случае не спасает, т.к. компутер (и даже объединенные все компы мира) - устройство хоть и чрезвычайно мощное и емкое, но увы! конечное, чего никак нельзя сказать об этой простейшей математической абстракции - натуральном ряде
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2010, 18:25     Шахматы
Еще ссылки по теме:

Шахматы в консоли C++
Шахматы в с++ C++
Шахматы в С++ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
10.03.2010, 18:25     Шахматы #14
так она еще раньше может превыситься в вычитаниях
Неправда.
dx=100000, dy=100000
Вычесть еще можем, а вот перемножить уже не можем.
Yandex
Объявления
10.03.2010, 18:25     Шахматы
Ответ Создать тему
Опции темы

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