Задача. На шахматной доске стоят черный король и белые ладья и слон (ладья бьет по горизонтали и вертикали, слон — по диагоналям). Проверить, есть ли угроза королю и если есть, то от кого именно. Учесть возможность защиты (например, ладья не бьет через слона).
[latex]x _{1}, y_{1}[/latex]- координаты слона. [latex]x _{2}, y_{2}[/latex]- координаты ладьи. [latex]x _{3}, y_{3}[/latex]- координаты короля.Таблица:
[latex]x _{1} [/latex] | [latex]y _{1} [/latex] | [latex]x _{2} [/latex] | [latex]y _{2} [/latex] | [latex]x _{3} [/latex] | [latex]y _{3} [/latex] | Предполагаемый результат | Комментарий |
1 | 1 | 2 | 2 | 4 | 4 | Ладья перекрывает шаг от слона. | Тест пройден |
4 | 5 | 2 | 5 | 5 | 5 | Слон перекрывает шаг от ладьи. | Тест пройден |
1 | 1 | 4 | 5 | 5 | 5 | Короля атакует и слон и ладья. | Тест пройден |
5 | 1 | 4 | 5 | 5 | 5 | Ладья атакует короля. | Тест пройден |
5 | 1 | 5 | 3 | 5 | 5 | Ладья атакует короля. | Тест пройден |
3 | 1 | 4 | 2 | 5 | 3 | Ладья перекрывает шаг от слона. | Тест пройден |
4 | 2 | 3 | 1 | 5 | 3 | Слон объявляет шаг королю. | Тест пройден |
1 | 4 | 5 | 3 | 2 | 2 | Короля не атакует никакая фигура. | Тест пройден |
Исходный код программы:
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 |
#include <stdio.h> #include <math.h> int main (){ int x1, x2, x3, y1, y2, y3; //Объявляем переменные, обозначающие координаты фигур printf("Введите координаты слона\n"); // scanf("%d %d", &x1, &y1); // printf("Введите координаты ладьи\n"); //Вводим координаты фигур, printf'ы помогают не запутаться. scanf("%d %d", &x2, &y2); // printf("Введите координаты короля\n"); // scanf("%d %d", &x3, &y3); // if((x1==x2&&y1==y2)||(x2==x3&&y2==y3)||(x1==x3&&y1==y3)){ //Проверка правильности ввода printf("Ошибка"); return 0; } if(((x2!=x3)&&(y2!=y3))&&(fabs(x1-x3)!=fabs(y1-y3))){ //Проверка условия №1 printf("Короля не атакует никакая фигура\n"); } if(x2==x3||y2==y3){ //Проверка условия №2 if( ((x1==x2&&x2==x3)||(y1==y2&&y2==y3)) && //Уточняющее условие №1 (((y1>y2&&y3>y1)||(y1<y2&&y3<y1))||((x1>x2&&x3>x1)||(x1<x2&&x3<x1))) ) printf("Слон перекрывает шаx от ладьи\n"); else{ printf("Ладья объявляет шаx королю\n"); } } if(fabs(x1-x3)==fabs(y1-y3)){ //Проверка условия №3 if((fabs(x2-x1)==fabs(y2-y1)&&fabs(x3-x2)==fabs(y3-y2))&& //Уточняющее условие №2 (((y2>y1)&&(y3>y2))||((y2<y1)&&(y3<y2)))) printf("Ладья перекрывает шах от слона\n"); else{ printf("Слон объявляет шах королю\n"); } } return 0; //Конец. } |
Описание:
По условию задачи необходимо узнать атакуют ли фигуры короля. Для этого я использовал полный перебор всех возможных вариантов взаимодействия данных фигур.
Алгоритм:
- Объявляем переменные и вводим их значения.
- Проверка условий.
- Проверка правильности ввода (не совпадают координаты фигур).
- Проверка условия №1. Проверяем, может ли короля хоть кто-то атаковать. Т. е. стоят ли ладья и король на одной горизонтальной или вертикальной линии или стоит ли король на одной диагонали со слоном.
- Проверка условия №2. Проверяем отдельно ладью. Если какая-то координата у ладьи и короля совпадает, то проверяем, находится ли слон между ними. Вывод результата.
- Проверка условия №1. Проверка слона, если король и слон расположены на одной диагонали, то проверяем, находится ли ладья между ними. Вывод результата.
- Окончание работы.
Зачтено, но
— добавьте в метки «ладья», «слон», «король», «шах»
— в пояснении вы описываете код программы, а нужно алгоритм. Про самое интересное Вы пишите просто «проверяем»