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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2023, 15:05   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию На шахматной доске определите поля, в которые может попасть конь за n ходов из указанной позиции.

Задание: На шахматной доске определите поля, в которые может попасть конь за n ходов из указанной позиции.
У меня почему-то выходит неправильно, если я считаю сама на шахматной доске.
Мне нужно распечатать с х и у , а также как на доске это выглядит. Шаги все отражать, включая последний n шаг.
Подскажите, в чем ошибка, уже кучу литературы прочитала, как надо описывать, себе пометила комментарии (может я неправильно пометила комментарии, подскажите). Еще если неверно введен шаг или еще что-то у меня почему-то не работает while , как это сделать. Всем буду благодарна за помощь, уже давно бьюсь с этой программой.
Код:
#include <iostream>
#include <math.h>
using namespace std;

bool prov(int x, int y, int razm) //проверяем правильную позицию квадратов коня
{
return ((x >= 0) && (y >= 0) && (x < razm) && (y < razm));
}

void func(int** doska, int kon_x, int kon_y, int razm, int step)
{
// Условие выхода из рекурсии
if (step == 0)
{
doska[kon_y][kon_x] = 1;
return;// Не нужно возвращать значение функции, так как меняется только состояние доски, а доска одна
}

// Количество возможных ходов 8
int new_x[8] = { -2, -2, -1, -1, 1, 1, 2, 2 };
int new_y[8] = { -1, 1, -2, 2, -2, 2, -1, 1 };

// А теперь их перебираем
for (int i = 0; i < 8; i++)
{
int x = kon_x + new_x[i];
int y = kon_y + new_y[i];

// Если новая позиция корректная
if (prov(x, y, razm))
{
//doska[y][x] = 1, то делаем рекурсивный вызов
func(doska, x, y, razm, step - 1);
}
}
}
int main()
{
setlocale(LC_ALL, "Russian");
int n, kon_x, kon_y, step;

cout << "Введите размер поля: " ;
cin >> n;
while (n <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите размер поля снова: ";
}
int** doska = new int* [n];
for (int i = 0; i < n; i++)
doska[i] = new int[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
doska[i][j] = 0;
}
cout << "Введите позицию лошади:" << endl;
cout << "номер строки x = ";
cin >> kon_x;
cout << "номер столбца y = ";
cin >> kon_y;
while ((kon_x <= 0) || (kon_y <= 0))
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите положение лошади снова: ";
}
// Уменьшается на единицу каждый индекс, так как пользователь считает с 1, а я с 0
kon_x--;
kon_y--;
cout << "Введите количество шагов: ";
cin >> step;
while (step <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите количество шагов снова: ";
}

func(doska, kon_x, kon_y, n, step); // печать с х и у
for (int i = 0; i < n; i++)
{
cout << " " << endl;
for (int j = 0; j < n; j++)
{
if (doska[i][j] == 1)
cout << "x = " << j + 1 << " " << "y = " << i + 1 << endl;

}
cout << endl;
}

func(doska, kon_x, kon_y, n, step); // печать как на шахматной доске
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << doska[i][j] << " ";
}
cout << endl;
}

system("pause");
return 0;
}

Последний раз редактировалось lenaiv; 16.03.2023 в 15:08.
lenaiv вне форума Ответить с цитированием
Старый 16.03.2023, 15:43   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
cin >> n;
while (n <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите размер поля снова: ";
}
Вот тут вы вводите значение n вне цикла. Внутри цикла значение n не меняется. Значит условие выхода из цикла n <= 0 будет всегда истинно и цикл будет бесконечным
Код:
cin >> n;
while (n <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите размер поля снова: ";
cin >> n; // Теперь цикл закончится, когда ввод будет правильным
}
Это же относится и к этому коду
Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
cout << "номер строки x = ";
cin >> kon_x;
cout << "номер столбца y = ";
cin >> kon_y;
while ((kon_x <= 0) || (kon_y <= 0))
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите положение лошади снова: ";
}
Код:
cout << "номер строки x = ";
cin >> kon_x;
cout << "номер столбца y = ";
cin >> kon_y;
while ((kon_x < 1) || (kon_y < 1) || (kon_x > n) || (kon_y > n))
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите положение лошади снова: ";

// Теперь цикл закончится, когда ввод будут правильными
cout << "номер строки x = ";
cin >> kon_x;
cout << "номер столбца y = ";
cin >> kon_y;
}
И к этому
Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
cout << "Введите количество шагов: ";
cin >> step;
while (step <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите количество шагов снова: ";
}
Код:
cout << "Введите количество шагов: ";
cin >> step;
while (step <= 0)
{
cin.clear();
while (cin.get() != '\n');
cout << "Неверно. Введите количество шагов снова: ";
cin >> step; // Теперь цикл закончится, когда ввод будет правильным
}
Цитата:
Сообщение от lenaiv Посмотреть сообщение
Код:
if (step == 0)
{
doska[kon_y][kon_x] = 1;
return;// Не нужно возвращать значение функции, так как меняется только состояние доски, а доска одна
}
Попробуйте заполнять доску не 1, а значениями step. Тогда будет видно какие клетки могут быть достигнуты на каком ходе.

Последний раз редактировалось macomics; 16.03.2023 в 15:50.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Минимальное количество шагов шахматного коня, чтобы достигнуть определенной позиции на шахматной доске Programist_r Помощь студентам 1 09.01.2020 19:52
Ладья на шахматной доске C++ VIGANTI Помощь студентам 2 09.10.2012 20:15
На шахматной доске определить поля, в которые может попасть конь из указанной позиции. ValeriySergeevich Помощь студентам 0 24.02.2012 22:31
Си/Си++ Слоны на шахматной доске Маришка_Курносова Помощь студентам 1 12.09.2010 01:02
монетки на шахматной доске! grimm_jow Общие вопросы C/C++ 2 31.01.2010 10:27