Другие языки программирования и технологии
Как 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();
}
// 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();
}
Дело пахнет рекурентной процедурой вообще-то. Хотя в данном случае существует и некоторая вполне определенная стратегия, легче сделать полный перебор.
Кстати, условие можно было записать гораздо проще при помощи модулей (abs).
if (abs(i-k)==1 && abs(j-l)==2 || abs(i-k)==2 && abs(j-l)==1) - смекаешь?
Кстати, условие можно было записать гораздо проще при помощи модулей (abs).
if (abs(i-k)==1 && abs(j-l)==2 || abs(i-k)==2 && abs(j-l)==1) - смекаешь?
Похожие вопросы
- Как записать образ на DVD, если он на него не помещается? Battlefield Bad Company 2 великоват...
- СКАЧАЛ WiNdOwS sP3 original,записал, а при перезагрузке ниче невыбивает( окно там гдк форматировать) ПоМоГиТе
- всем привет. народ скажите как записать образ диска. я уже про*бал 4 диск.
- как записать свой мр3 диск, что бы авто читал
- Помогите записать на языке паскаля.
- немогу записать образ винды на диск
- Почему я не могу записать образ?
- У меня есть видео с размером 9 гигабайт 1 фаил как разделить его на 2 части чтоб записать на диск и не потерять качество
- Запишите 2/3 в шестеричной системе счисления. Помогите с решением..
- Почему DVD(не ПК) не видит видео на диске DVD+RW записанное Нэркой ?Как записать фильм читаемый проигоывателем?