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

Решение задачи на ветвление (2 коня и шахматная доска) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 12:18     Решение задачи на ветвление (2 коня и шахматная доска) #1
Поле шахматной доски определяется парой натуральных чисел, каждое которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа a, b, c, d, e, f, каждое из которых не превосходит восьми. На поле (a, b) расположена белая фигура, на поле (c, d) – черная. Определить, может ли белая фигура пойти на поле (e, f), не попав при этом под удар черной фигуры. Рассмотреть вариант сочетания белой и черной фигур: конь и конь.

p.s. проходим только ветвление!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 12:18     Решение задачи на ветвление (2 коня и шахматная доска)
Посмотрите здесь:

шахматная доска C++
C++ Написать задачку на двумерные массивы(Шахматная доска.На ней расположены 2 черных коня и белый слон).
шахматная доска!! C++
C++ шахматная доска
C++ шахматная доска
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
11.02.2014, 12:38     Решение задачи на ветвление (2 коня и шахматная доска) #2
У каждого коня есть только 8 вариантов хода максимально и один минимально, я помню описывал его простым в лоб способом, но может быть и лучше. Конь может пойти на 2 клетки вверх или вниз по вертикали и на одну клетку вправо или влево по горизонтали, это первые 4 условия. и соответственно на одну клетку вверх или вниз по вертикали и две клетки влево или вправо по горизонтали. Ну и не совпавшие у обоих коней клетки куда они могут пойти будут искомыми.
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 12:45     Решение задачи на ветвление (2 коня и шахматная доска) #3
мне кажется, тут задача стоит конкретнее - у нас уже есть координаты расположения коней и координаты клетки, которую надо проверить.
В такой ситуации я предлагаю вот что сделать:
1) проверяем координаты (e,f) - бьются ли они черным конем.
делается это примерно так:
C++
1
    if (  (abs(e-d)==1 && abs(f-c)==2) || (abs(e-d)==2 && abs(f-c)==1)
если не бьется - все, сразу белому можно ходить без угрозы. Если бьется - идем дальше.
2) аналогично проверяем, может ли белый вообще попасть на эту клетку.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
11.02.2014, 12:55     Решение задачи на ветвление (2 коня и шахматная доска) #4
Странно я понял так что если бы задача была конкретнее, то вместо a,b,c,d были бы конкретные координаты а тут буквенные обозначения говорящие о том что они могут быть какими угодными.
Хотя соглашусь ваша проверка выглядит куда лучше, чем то о чем говорил я.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
11.02.2014, 13:01     Решение задачи на ветвление (2 коня и шахматная доска) #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
1) проверяем координаты (e,f) - бьются ли они черным конем.
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
if ( *(abs(e-d)==1 && abs(f-c)==2) || (abs(e-d)==2 && abs(f-c)==1)
есть способ по быстрее и попроще
конь ходит на две клетки в одном направлении и на одну в другом
значит произведение должно быть или 2 или -2
итого
C++
1
if(abs((e-d)*(f-c))==2)
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:02     Решение задачи на ветвление (2 коня и шахматная доска) #6
Мне просто показалось, что числа a,b,...,e могут быть любыми, но они известны. Т.е. там с клавиатуры вводятся или что-то такое.


А вообще подобных задач интересных с конями огромное множество. Помню, мы их через массивы решали, а вот недавно прочитал про списки в С++, думаю, может как-то и проще можно, при помощи списков.
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:10  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #7
все числа вводятся вводятся с клавиатуры и могут быть 1-8, потому что поле шахматной доски 8х8

p.s. что такое abs?

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
есть способ по быстрее и попроще
конь ходит на две клетки в одном направлении и на одну в другом
значит произведение должно быть или 2 или -2
итого
C++
1
if(abs((e-d)*(f-c))==2)
все числа вводятся вводятся с клавиатуры и могут быть 1-8, потому что поле шахматной доски 8х8

p.s. что такое abs?
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:13     Решение задачи на ветвление (2 коня и шахматная доска) #8
abs - функция, возвращающая модуль. От англ absolute
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:14  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #9
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
abs - функция, возвращающая модуль. От англ absolute
а можно как нибудь без нее?) используя именно только ветвление
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:16     Решение задачи на ветвление (2 коня и шахматная доска) #10
Да, можно.
Предлагаю взять тогда вариант ValeryS, он действительно наиболее оптимальный.
Его условие
C++
1
if(abs((e-d)*(f-c))==2)
превратится тогда в
C++
1
if ( (e-d)*(f-c) == 2 || (e-d)*(f-c) == -2)
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:26  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #11
aaaaargh...
я ничего не понимаю
можете популярней объяснить?
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:37     Решение задачи на ветвление (2 коня и шахматная доска) #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сейчас попробую)
Итак, у нас есть координаты двух коней и клетки, которую нужно проверить - можно ли туда ходить конем.

1) проверяем координаты (e,f) - бьются ли они черным конем.
делается это так:
C++
1
if ( (e-d)*(f-c) == 2 || (e-d)*(f-c) == -2)
это означает, как и сказал ValeryS, условие, что конь может попасть в эту клетку. Потому что он ходит буквой Г же, т.е. может сместиться на 1 клетку в одном направлении и на 2 - в другом.

2) аналогично проверяем, может ли белый вообще попасть на эту клетку.

В итоге это все примерно так выглядит:
C++
1
2
3
        if ( (e-d)*(f-c) == 2 || (e-d)*(f-c) == -2)              // черный бьет клетку, а значит нельзя белому ходить
             if ((a-e)*(b-f) == 2 || (a-e)*(b-f)==-2)           // белый также попадает на эту клетку
             cout << "НЕЛЬЗЯ ХОДИТЬ!";
ну и не забудь для красоты и корректности все else условия описать:
черный бьет, но белый не попадает,
черный не бьет и т.д.


я старался донести мысль свою) стало яснее?
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:57  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #13
если кому не трудно, скиньте исходник для копипаста)
спасибо большое заранее)
мне стыдно блин уже одно и то же спрашивать, но не получается понять, скиньте мне его, а там уж я сам разберусь
fofin
Сообщений: n/a
11.02.2014, 14:18     Решение задачи на ветвление (2 коня и шахматная доска) #14
Да!!

Добавлено через 16 минут
Похожая задача, помогите если не сложно
4. Поле шахматной доски определяется парой натуральных чисел, каждое которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа a, b, c, d, e, f, каждое из которых не превосходит восьми. Определить, являются ли поля (a, b) и (c, d) полями одного цвета.
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 14:28  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #15
Где исходник?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
11.02.2014, 15:04     Решение задачи на ветвление (2 коня и шахматная доска) #16
Цитата Сообщение от hunter2014 Посмотреть сообщение
но не получается понять,
а что тут не понятного
конь ходит буквой "Г"
две по вертикали и одну клетку по горизонтали или одну по вертикали и две по горизонтали
в любом случае произведение дельт( разница между начальной и конечной точкой) даст 2 по модулю, отличатся могут знаками, влево/ вправо сходил вверх/вниз
например конь стоит на клетке 1 1 нужно проверить попадает ли он на клетку 3 2
проверяем
(3-1(дельта по вертикали)) * )(2-1( дельта по горизонтали ))
2*1=2
значит конь сходить на эту клетку может
в результате получается два if
первый проверяет может ли вообще белый конь попасть на эту клетку
второй проверяет бъется ли эта клетка черным конем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ( (a-e)*(b-f) == 2 || (a-e)*(b-f) == -2)
{
 // белый конь может попасть на клетку e, f
   if ( (e-d)*(f-c) == 2 || (e-d)*(f-c) == -2)
     {
     // клетка  e, f бьется черным конем
     }
    else
     {
     // клетка  e, f не бьется черным конем
     }
 }
else
 {
// белый конь не может попасть на клетку e, f
 }
здесь не предусмотрен вариант что белый конь может сходить на место черного коня, т.е изначально стоит на клетке которая бьется черным конем
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 15:44  [ТС]     Решение задачи на ветвление (2 коня и шахматная доска) #17
Цитата Сообщение от ValeryS Посмотреть сообщение
а что тут не понятного
конь ходит буквой "Г"
две по вертикали и одну клетку по горизонтали или одну по вертикали и две по горизонтали
в любом случае произведение дельт( разница между начальной и конечной точкой) даст 2 по модулю, отличатся могут знаками, влево/ вправо сходил вверх/вниз
например конь стоит на клетке 1 1 нужно проверить попадает ли он на клетку 3 2
проверяем
(3-1(дельта по вертикали)) * )(2-1( дельта по горизонтали ))
2*1=2
значит конь сходить на эту клетку может
в результате получается два if
первый проверяет может ли вообще белый конь попасть на эту клетку
второй проверяет бъется ли эта клетка черным конем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ( (a-e)*(b-f) == 2 || (a-e)*(b-f) == -2)
{
 // белый конь может попасть на клетку e, f
   if ( (e-d)*(f-c) == 2 || (e-d)*(f-c) == -2)
     {
     // клетка  e, f бьется черным конем
     }
    else
     {
     // клетка  e, f не бьется черным конем
     }
 }
else
 {
// белый конь не может попасть на клетку e, f
 }
здесь не предусмотрен вариант что белый конь может сходить на место черного коня, т.е изначально стоит на клетке которая бьется черным конем
спасбо, я все уже сам сделал)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 16:04     Решение задачи на ветвление (2 коня и шахматная доска)
Еще ссылки по теме:

Шахматная доска C++
C++ Шахматная доска
Шахматная доска C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
11.02.2014, 16:04     Решение задачи на ветвление (2 коня и шахматная доска) #18
Цитата Сообщение от fofin Посмотреть сообщение
Определить, являются ли поля (a, b) и (c, d) полями одного цвета.
дельты или должны быть равны ( диагональ)
или обе быть кратны двум или обе не кратны двум

C++
1
if(abs(a-c)==abs(b-d) || (abs(a-c)%2 ==1 && abs(b-d) %2==1) ||(abs(a-c)%2 ==0 && abs(b-d) %2==0))
легко видеть что первое условие избыточно, можно выбросить, второе и третье должны работать в паре
упрощаем
C++
1
if((abs(a-c)%2)==(abs(b-d)%2))
что означает или обе дельты кратны двум или обе не кратны
Yandex
Объявления
11.02.2014, 16:04     Решение задачи на ветвление (2 коня и шахматная доска)
Ответ Создать тему
Опции темы

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