Построить алгоритм ходов коня по шахматной доске с помощью рекурсии - C (СИ)
Формулировка задачи:
Здравствуйте.
Суть задачи:
построить алгоритм ходов коня по шахматной доске с помощью рекурсии. Классическая задача. Знаю, что есть множество тем, но у меня функция которая строит ходы void. То есть нужно просто перезаписать существующий нулевой массив цифрами ходов коня. Перерыл весь нет, но либо не нашел, либо не понял, как обойтись без return.
Буду рад, если кто-то подправит код и пояснит что конкретно на каком шаге делает функция. Очень сложно для понимания, особенно для новичка. Я в свою очередь готов отблагодарить человека, который поможет.
Спасибо всем.
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; //"Шахматный конь" int const size = 8; int Matrix[size][size]; int hod = 1; void name() { cout << "\t\t\t\tШахматный конь \n"; } void generation(int Matrix[size][size], int size) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { Matrix[i][j] = 0; } } } void vuvod(int Matrix[size][size], int size) { for (int i = 0; i < size; i++) { cout << "---------------------------------" << endl; for (int j = 0; j < size; j++) { if (j < size - 1) cout << "|" << " " << Matrix[i][j] << " "; else cout << "|" << " " << Matrix[i][j] << " " << "|"; } cout << endl; } cout << "---------------------------------" << endl; } int nachalo() { int x0, y0; cout << "Введите координаты первоначального положения коня(цифры от 1 до 8)\n"; cout << "Координата оси абсцисс(X)\n"; cin >> x0; cout << "Координата оси ординат(Y)\n"; cin >> y0; return x0 * 10 + y0; } void kon(int x0, int y0) { int x1, y1; int Matrix_hodov_X[size] = { 2, 1, -1, -2, -2, -1, 1, 2 }; int Matrix_hodov_Y[size] = { 1, 2, 2, 1, -1, -2, -2, -1 }; if (hod == 1) Matrix[x0][y0] = hod; for (int i = 0; i < size; i++) { x1 = x0 + Matrix_hodov_X[i]; y1 = y0 + Matrix_hodov_Y[i]; if (x1 >= 0 && y1 >= 0 && x1 < size && y1 < size && Matrix[x1][y1] == 0) { hod++; Matrix[x1][y1] = hod; kon(x1, y1); } else { hod--; Matrix[x0][y0] = 0; break; } } } void main() { setlocale(LC_ALL, "Russian"); srand((unsigned)time(0)); int a, b, res; generation(Matrix, size); vuvod(Matrix, size); res = nachalo(); a = res / 10 - 1; b = res % 10 - 1; kon(a, b); vuvod(Matrix, size); }
Решение задачи: «Построить алгоритм ходов коня по шахматной доске с помощью рекурсии»
textual
Листинг программы
if (desk[x0][y0] !=0) return(0); // поле уже пройдено desk[x0][y0] = ++nstep; // отметить свободное поле if (nstep == N*N) return(1); // все поля отмечены - успех for (i=0; i<8; i++) if (step(x0+xy[i][0], y0+xy[i][1])) return(1); // поиск успешного хода nstep--; // вернуться на ход назад desk[x0][y0] = 0; // стереть отметку поля return(0); // последовательность не найдена
Объяснение кода листинга программы
В данном коде реализуется алгоритм ходов коня по шахматной доске с помощью рекурсии. Список действий:
- Проверить, занято ли текущее поле (desk[x0][y0]). Если да, то возвращается 0.
- Отметить текущее свободное поле (desk[x0][y0] = ++nstep).
- Если nstep == N*N (все поля отмечены), то возвращается 1.
- Для каждого из 8 направлений хода коня (i=0; i<8; i++) рекурсивно вызывается функция step(x0+xy[i][0], y0+xy[i][1]).
- Если одно из направлений успешно (step(x0+xy[i][0], y0+xy[i][1])), то возвращается 1.
- nstep уменьшается на 1.
- desk[x0][y0] сбрасывается в 0.
- Возвращается 0. Пожалуйста, обратите внимание, что код представлен в упрощенной форме и не содержит деталей, таких как проверка выхода за границы доски или обработка особых случаев.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д