Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
1

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

11.02.2014, 12:18. Просмотров 1878. Ответов 17
Метки нет (Все метки)

Поле шахматной доски определяется парой натуральных чисел, каждое которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа a, b, c, d, e, f, каждое из которых не превосходит восьми. На поле (a, b) расположена белая фигура, на поле (c, d) – черная. Определить, может ли белая фигура пойти на поле (e, f), не попав при этом под удар черной фигуры. Рассмотреть вариант сочетания белой и черной фигур: конь и конь.

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

Написать задачку на двумерные массивы(Шахматная доска.На ней расположены 2 черных коня и белый слон).
Помогите написать задачку на двумерные массивы. Задача: Шахматная доска.На ней расположены 2...

Шахматная доска
Ребят, сейчас друг сидит на собеседовании, ему досталась какая-то слишком легкая задача (хотя...

Шахматная доска
Даны координаты двух различных полей шахматной доски x1,x2,y1,y2(Целые числа лежащие в диапазоне от...

шахматная доска!!
Нужно вывести шахматную доску, где белые клетки - 0 и черные - 1, воспользовавшись тем, что если...

Шахматная доска
Заполнить двумерный массив единицами и нулями таким образом, чтобы единицы размещались так, как на...

17
ShadowFirst
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 164
11.02.2014, 12:38 2
У каждого коня есть только 8 вариантов хода максимально и один минимально, я помню описывал его простым в лоб способом, но может быть и лучше. Конь может пойти на 2 клетки вверх или вниз по вертикали и на одну клетку вправо или влево по горизонтали, это первые 4 условия. и соответственно на одну клетку вверх или вниз по вертикали и две клетки влево или вправо по горизонтали. Ну и не совпавшие у обоих коней клетки куда они могут пойти будут искомыми.
1
Mihail Samohval
5 / 5 / 2
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 12:45 3
мне кажется, тут задача стоит конкретнее - у нас уже есть координаты расположения коней и координаты клетки, которую надо проверить.
В такой ситуации я предлагаю вот что сделать:
1) проверяем координаты (e,f) - бьются ли они черным конем.
делается это примерно так:
C++
1
    if (  (abs(e-d)==1 && abs(f-c)==2) || (abs(e-d)==2 && abs(f-c)==1)
если не бьется - все, сразу белому можно ходить без угрозы. Если бьется - идем дальше.
2) аналогично проверяем, может ли белый вообще попасть на эту клетку.
1
ShadowFirst
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 164
11.02.2014, 12:55 4
Странно я понял так что если бы задача была конкретнее, то вместо a,b,c,d были бы конкретные координаты а тут буквенные обозначения говорящие о том что они могут быть какими угодными.
Хотя соглашусь ваша проверка выглядит куда лучше, чем то о чем говорил я.
0
ValeryS
Модератор
7476 / 5661 / 723
Регистрация: 14.02.2011
Сообщений: 19,359
Завершенные тесты: 1
11.02.2014, 13:01 5
Лучший ответ Сообщение было отмечено hunter2014 как решение

Решение

Цитата Сообщение от 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)
1
Mihail Samohval
5 / 5 / 2
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:02 6
Мне просто показалось, что числа a,b,...,e могут быть любыми, но они известны. Т.е. там с клавиатуры вводятся или что-то такое.


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

Решение

Сейчас попробую)
Итак, у нас есть координаты двух коней и клетки, которую нужно проверить - можно ли туда ходить конем.

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 условия описать:
черный бьет, но белый не попадает,
черный не бьет и т.д.


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

Добавлено через 16 минут
Похожая задача, помогите если не сложно
4. Поле шахматной доски определяется парой натуральных чисел, каждое которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа a, b, c, d, e, f, каждое из которых не превосходит восьми. Определить, являются ли поля (a, b) и (c, d) полями одного цвета.
0
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 14:28  [ТС] 15
Где исходник?
0
ValeryS
Модератор
7476 / 5661 / 723
Регистрация: 14.02.2011
Сообщений: 19,359
Завершенные тесты: 1
11.02.2014, 15:04 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
 }
здесь не предусмотрен вариант что белый конь может сходить на место черного коня, т.е изначально стоит на клетке которая бьется черным конем
1
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 15:44  [ТС] 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
 }
здесь не предусмотрен вариант что белый конь может сходить на место черного коня, т.е изначально стоит на клетке которая бьется черным конем
спасбо, я все уже сам сделал)
0
ValeryS
Модератор
7476 / 5661 / 723
Регистрация: 14.02.2011
Сообщений: 19,359
Завершенные тесты: 1
11.02.2014, 16:04 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))
что означает или обе дельты кратны двум или обе не кратны
2
11.02.2014, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 16:04

С++ Шахматная доска
Помогите пожалуйста с заданием. Нужно сделать шахматную доску 16*16 и пользователь должен ввести...

шахматная доска
Здравствуйте! Есть задача: дана шахматная доска размером NxN, нужно расставить N ферзей таким...

шахматная доска
помогите написать программу, которая отображает на экране следующий рисунок шахматной доски:


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru