Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2014, 04:21   #1
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию Проверить, не находится ли король под боем

Здравствуйте. Есть такая задача. На шахматной доске стоят три белые ладьи (ладья бьет по горизонтали и вертикали) и черный король. Проверить, не находится ли король под боем, а если есть угроза, то от какой именно ладьи.
Вот решение:
Код:
#include <stdio.h>
 
int main()
{
    int x, y, x1, y1, x2, y2, x3, y3;
    printf("Введите координаты короля: \n");
    scanf("%d", &x);
    scanf("%d", &y);//ввод координат короля
    printf("Введите координаты первой ладьи: \n");
    scanf("%d", &x1);
    scanf("%d", &y1);//ввод координат 1 ладьи
    printf("Введите координаты второй ладьи: \n");
    scanf("%d", &x2);
    scanf("%d", &y2);//ввод координат 2 ладьи
    printf("Введите координаты третьей ладьи: \n");
    scanf("%d", &x3);
    scanf("%d", &y3);//ввод координат 3 ладьи
    if (((x != x1) || (y != y1)) && ((x != x2) || (y != y2)) && ((x != x3) || (y != y3)) && ((x1 != x2) 
                      || (y1 != y2)) && ((x1 != x3) || (y1 != y3)) && ((x2 != x3) || (y2 != y3)))
    {
        if ((x == x1) || (y == y1))
        {
            printf(" x = %d; y = %d \n x1 = %d;  y1 = %d \n Угроза от первой ладьи", x, y, x1, y1);
        }
        else
        {
            if ((x == x2) || (y == y2))
            {
                printf(" x = %d; y = %d \n x2 = %d;  y2 = %d \n Угроза от второй ладьи\n", x, y, x2, y2);
            }
            else
            {
                if ((x == x3) || (y == y3))
                {
                    printf(" x = %d ; y = %d \n x3 = %d ;  y3 = %d \n Угроза от третьей ладьи\n", x, y, x3, y3);
                }
                else
                {
                    printf(" x = %d ; y = %d \n x1 = %d ;  y1 = %d \n x2 = %d ;  y2 = %d \n x3 = %d ;  y3 = %d \n Угрозы нет"
                                 , x, y, x1, y1, x2, y2, x3, y3);
                }
            }
 
        }
    }
    else
    {
        printf("Ошибка*");
    }
    getchar();
    getchar();
    return 0;
}
Преподаватель сделал замечания к программе: Вы не учитываете, что ладьи могут "мешать" друг другу. На факт угрозы это не повлияет, но она будет исходить от другой ладьи. Вы не учитываете, что угрожать может не только одна ладья, а несколько. Помогите исправить.

Последний раз редактировалось Stilet; 28.10.2014 в 07:22.
Nickolay0512 вне форума Ответить с цитированием
Старый 28.10.2014, 07:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Логично...
Код:
    int x, y, x1, y1, x2, y2, x3, y3;
    printf("Введите координаты короля: \n");
    scanf("%d", &x);
    scanf("%d", &y);//ввод координат короля
    printf("Введите координаты первой ладьи: \n");
    scanf("%d", &x1);
    scanf("%d", &y1);//ввод координат 1 ладьи
    printf("Введите координаты второй ладьи: \n");
    scanf("%d", &x2);
    scanf("%d", &y2);//ввод координат 2 ладьи
    printf("Введите координаты третьей ладьи: \n");
    scanf("%d", &x3);
    scanf("%d", &y3);//ввод координат 3 ладьи
    
     bool b1=((x == x1) || (y == y1)),b2=((x == x2) || (y == y2)),b3=((x == x3) || (y == y3));

        if(!b1 && !b2 && !b3) 
    printf(" x = %d ; y = %d \n x1 = %d ;  y1 = %d \n x2 = %d ;  y2 = %d \n x3 = %d ;  y3 = %d \n Угрозы нет"
                                 , x, y, x1, y1, x2, y2, x3, y3);
      else {
        if (b1) printf(" x = %d; y = %d \n x1 = %d;  y1 = %d \n Угроза от первой ладьи", x, y, x1, y1);
        if (b2) printf(" x = %d; y = %d \n x2 = %d;  y2 = %d \n Угроза от второй ладьи\n", x, y, x2, y2);
        if (b3) printf(" x = %d ; y = %d \n x3 = %d ;  y3 = %d \n Угроза от третьей ладьи\n", x, y, x3, y3);
      }
Сюда же нужно дописать вычисление дистанции между угрожающими ладьями.
т.е. что-то типа
Код:
if (b1 && b2){
  if(abs(x-x1)<abs(x-x2)) printf(" x = %d; y = %d \n x1 = %d;  y1 = %d \n Угроза от первой ладьи", x, y, x1, y1); else
  printf(" x = %d; y = %d \n x2 = %d;  y2 = %d \n Угроза от второй ладьи\n", x, y, x2, y2); 
}
if (b1 && b3){
  if(abs(x-x1)<abs(x-x3)) printf(" x = %d; y = %d \n x1 = %d;  y1 = %d \n Угроза от первой ладьи", x, y, x1, y1); else
  printf(" x = %d ; y = %d \n x3 = %d ;  y3 = %d \n Угроза от третьей ладьи\n", x, y, x3, y3); 
}
Я тоже не совсем правильно написал, но смысл в расчете дистанции (какая из угроз ближе) надеюсь ясен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Установить на шахматной доске минимум ферзей (первоначально 8), чтобы каждое поле было под боем pyxamex Паскаль, Turbo Pascal, PascalABC.NET 0 29.05.2014 13:57
Дочернее окно находится под компонентами главной Silentdi Общие вопросы Delphi 1 13.04.2011 09:36
Как узнать какой компонент находится под изображением Marsel737 Общие вопросы Delphi 6 31.08.2010 11:33
Узнать путь и имя файла который находится под курсором? Kostia Win Api 4 20.11.2009 12:16