Другие языки программирования и технологии

Как 2 ход записать?

Вот условие: Поле шахматной доски определяется парой натуральных чисел: первое число - номер вертикали, второе - номер горизонтали (вертикали нумеруются слева направо, горизонтали - снизу вверх). Шахматная доска имеет размер 8х8. Даны натуральные числа i, j, k, l. Определить, можно ли с поля (i,j) одним ходом коня попасть на поле (k,l). Если нет, то выяснить, можно ли это сделать за два хода, если можно, то указать поле, на которое приводит первый ход (конь ходит буквой Г) Решение(1ход) Что дальше делать? Как записать 2 ход? #include <stdio.h> #include <math.h> #include <conio.h> int main() { //Ввод исходных данных unsigned int i, j, k, l; i = j = k = l = 0; printf("i= "); scanf("%d", &i); printf("j= "); scanf("%d", &j); printf("k= "); scanf("%d", &k); printf("l= "); scanf("%d", &l); if (i>0 && i<9 && j>0 && j<9 && k>0 && k<9 && l>0 && l<9) { //Если введенные координаты не выходят за рамки доски if ((k==i+2 && (l==j+1 || l==j-1)) || (k==i-2 && (l==j+1 || l==j-1)) || (k==i+1 && (l==j+2 || l==j-2)) || (k==i-1 && (l==j+2 || l==j-2))) printf("Можно в попасть в клетку %d-%d за 1 ход\n", k, l); else printf("Совершить данное перемещение за 1 ход невозможно!\n"); } else printf("Одна или более координат не принадлежат шахматной доске. Решение задачи невозможно!\n"); getch(); //Возвращает ноль при правильном return 0; //завершении програмы }
// Visual C++ console application
// Chess 1.0.0.0 official release
// ;-)
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <windows.h>

void main()
{
setlocale(LC_CTYPE, "Russian_Russia.1251");

int x1, x2, y1, y2, g, v, n = 0;

do
{
n++;
system("cls");

do
{
printf("\n Горизонтальная координата позиции коня: ");
scanf("%d", &x1);
}
while (x1 < 1 || x1 > 8);

do
{
printf(" Вертикальная координата позиции коня: \t ");
scanf("%d", &y1);
}
while (y1 < 1 || y1 > 8);

do
{
do
{
printf(" Горизонтальная координата поля: \t ");
scanf("%d", &x2);
}
while (x2 < 1 || x2 > 8);

do
{
printf(" Вертикальная координата поля: \t\t ");
scanf("%d", &y2);
}
while (y2 < 1 || y2 > 8);

if (x1 == x2 && y1 == y2) printf("\n Позиция и поле совпадают! %c", 7);
}
while (x1 == x2 && y1 == y2);

do
{
if (((x1 + x2) % 2 == (y1 + y2) % 2) ||
(abs(x1 - x2) == 1 && abs(y1 - y2) == 1) ||
abs(x1 - x2) > 2 ||
abs(y1 - y2) > 2 ||
abs(x1 - x2) + abs(y1 - y2) == 1)
printf("\n Конь не может попасть на поле за один ход. ");
else if ((abs(x1 - x2) != 1) || (abs(y1 - y2) != 1))
{
printf("\n Конь попадает на поле за один ход!!! ");
break;
}

if ((x1 + x2) % 2 != (y1 + y2) % 2 ||
((abs(x1 - x2) == 2) && (abs(y1 - y2) == 2)) ||
abs(x1 - x2) + abs(y1 - y2) > 6)
{
printf("\n Конь не может попасть на поле и за два хода. ");
break;
}
else
{
g = x1;
v = y1;

printf("\n\n Конь может попасть на поле за два хода. \n");

for (x1 = 1; x1 < 9; x1++)
for (y1 = 1; y1 < 9; y1++)
{
if (((x1 + x2) % 2 == (y1 + y2) % 2) ||
(abs(x1 - x2) == 1 && abs(y1 - y2) == 1) ||
abs(x1 - x2) > 2 ||
abs(y1 - y2) > 2 ||
abs(x1 - x2) + abs(y1 - y2) == 1 ||
(abs(g - x1) > 2) ||
(abs(v - y1) > 2) ||
(abs(g - x1) <= 1 && abs(v - y1) <= 1 )) continue;
printf("\n Возможные координаты певого хода (%d, %d)", x1, y1);
}
break;
}
}
while (n < 21);

getch();
}
while (n < 20);

printf("\n Количество тестов исчерпано! %c", 7);
getch();
}
ИВ
Игорь Воронин
99 929
Лучший ответ
Дело пахнет рекурентной процедурой вообще-то. Хотя в данном случае существует и некоторая вполне определенная стратегия, легче сделать полный перебор.
Кстати, условие можно было записать гораздо проще при помощи модулей (abs).

if (abs(i-k)==1 && abs(j-l)==2 || abs(i-k)==2 && abs(j-l)==1) - смекаешь?