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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
#1

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

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

Поле шахматной доски определяется парой натуральных чисел, каждое которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа 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++):

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

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

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

Шахматная доска - C++
Ребята, помогите! Есть код на С++, выводящий на экран шахматную доску, нужно его дополнить обозначением клеток (по горизонтали 1,2,3... , и...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
11.02.2014, 12:38 #2
У каждого коня есть только 8 вариантов хода максимально и один минимально, я помню описывал его простым в лоб способом, но может быть и лучше. Конь может пойти на 2 клетки вверх или вниз по вертикали и на одну клетку вправо или влево по горизонтали, это первые 4 условия. и соответственно на одну клетку вверх или вниз по вертикали и две клетки влево или вправо по горизонтали. Ну и не совпавшие у обоих коней клетки куда они могут пойти будут искомыми.
Mihail Samohval
5 / 5 / 1
Регистрация: 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) аналогично проверяем, может ли белый вообще попасть на эту клетку.
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
11.02.2014, 12:55 #4
Странно я понял так что если бы задача была конкретнее, то вместо a,b,c,d были бы конкретные координаты а тут буквенные обозначения говорящие о том что они могут быть какими угодными.
Хотя соглашусь ваша проверка выглядит куда лучше, чем то о чем говорил я.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
11.02.2014, 13:01 #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 #6
Мне просто показалось, что числа a,b,...,e могут быть любыми, но они известны. Т.е. там с клавиатуры вводятся или что-то такое.


А вообще подобных задач интересных с конями огромное множество. Помню, мы их через массивы решали, а вот недавно прочитал про списки в С++, думаю, может как-то и проще можно, при помощи списков.
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?
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:13 #8
abs - функция, возвращающая модуль. От англ absolute
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:14  [ТС] #9
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
abs - функция, возвращающая модуль. От англ absolute
а можно как нибудь без нее?) используя именно только ветвление
Mihail Samohval
5 / 5 / 1
Регистрация: 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)
hunter2014
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 14
11.02.2014, 13:26  [ТС] #11
aaaaargh...
я ничего не понимаю
можете популярней объяснить?
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
11.02.2014, 13:37 #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  [ТС] #13
если кому не трудно, скиньте исходник для копипаста)
спасибо большое заранее)
мне стыдно блин уже одно и то же спрашивать, но не получается понять, скиньте мне его, а там уж я сам разберусь
fofin
Сообщений: n/a
11.02.2014, 14:18 #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  [ТС] #15
Где исходник?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 14:28
Привет! Вот еще темы с ответами:

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

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

Шахматная доска - C++
Шахматная доска содержит 8x8 клеток. Горизонтали и вертикали обозначаются цифрами 1-8. Написать программу, проверяющую, можно ли с первой...

Шахматная доска - C++
Есть шахматная доска (8*8). Нужно с помощью фигуры &quot;конь&quot; обойти все 64 клетки шахматной доски. Что-то скопипастил, но работать не хочет....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.02.2014, 14:28
Ответ Создать тему
Опции темы

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