Написать программу, выводящую путь коня(клетка за клеткой) с помощью рекурсии - C#

Узнай цену своей работы

Формулировка задачи:

задача классическая: требуется написать программу получающую на вход начальное положение коня на шахматной доске, конь,собственно, должен обойти всю доску(8 на 8), не пропустив ни одной клетки, а выводить она должна путь коня(клетка за клеткой). программу надо реализовать обязательно с помощью рекурсии. вот набросок, сильно не ругайтесь за мой подход(возможно неправильный)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace рекурсия
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] X = new int[64], Y = new int[64];
            Console.WriteLine("Введите начальное положение коня");
            X[0] = Convert.ToInt32(Console.ReadLine());
            Y[0] = Convert.ToInt32(Console.ReadLine());
            int i = 0;
            int j = 1;
            Move(X,Y,i,j);
            for (i = 0; i<64; i++)
            {
                Console.WriteLine(X[i] + ' ' + Y[i]);
            }
            Console.ReadLine();
        }
        public static bool k = false;
        public static int f = 0;
        public static int b = 0;
        static void Move(int[] X, int[] Y, int i, int j)
        {
            if (j < 64)
            {
                switch (i)
                {
                    case 0: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] - 2); break;
                    case 1: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] + 1); break;
                    case 2: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] + 2); break;
                    case 3: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] - 1); break;
                    case 4: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] - 2); break;
                    case 5: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] - 1); break;
                    case 6: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] + 2); break;
                    case 7: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] + 1); break;
                }
                for (int l = 0; l < 64 && l != j; j++)
                {
                    if ((X[j] == X[l])&&(Y[j]==Y[l]))
                    {
                        k = true;
                    }
                }
                if (X[j] < 8 && X[j] > -1 && Y[j] < 8 && Y[j] > -1 && !k)
                {
                    i = 0;
                    j++;
                    Move(X, Y, i, j);
                }
                else
                {
                    X[j] = 0; Y[j] = 0;
                    j--;
                    i++;
                    if (i < 8)
                    {
                        Move(X, Y, i, j);
                    }
                    else
                    {
                        f = X[j] - X[j - 1];
                        b = Y[j] - Y[j - 1];
                        if ((f == 1) && (b == 2)) { i = 7; j--; }
                        if ((f == 1) && (b == -2)) { i = 1; j--; }
                        if ((f == -1) && (b == 2)) { i = 3; j--; }
                        if ((f == -1) && (b == -2)) { i = 5; j--; }
                        if ((f == 2) && (b == 1)) { i = 2; j--; }
                        if ((f == 2) && (b == -1)) { i = 6; j--; }
                        if ((f == -2) && (b == 1)) { i = 8; j--; }
                        if ((f == -2) && (b == -1)) { i = 4; j--; }
                    }
                    k = false;
                }
            }
        }
    }
}
ошибку выдает в первом цикле процедуры(вышел за границы массива), не пойму почему. Подскажите, что еще неправильно пожалуйста

Решение задачи: «Написать программу, выводящую путь коня(клетка за клеткой) с помощью рекурсии»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace рекурсия
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] X = new int[64], Y = new int[64];
            Console.WriteLine("Введите начальное положение коня");
            X[0] = 1/*Convert.ToInt32(Console.ReadLine())*/;
            Y[0] = 1/*Convert.ToInt32(Console.ReadLine())*/;
            int i = 0;
            int j = 1;
            Move(X,Y,i,j);
            for (i = 0; i<64; i++)
            {
                Console.WriteLine(X[i] + " " + Y[i]);
            }
            Console.ReadLine();
        }
        public static bool k = false;
        public static int f = 0;
        public static int b = 0;
        static void Move(int[] X, int[] Y, int i, int j)
        {
            
            if (j < 64)
            {
                switch (i)
                {
                    case 0: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] - 2); break;
                    case 1: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] + 1); break;
                    case 2: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] + 2); break;
                    case 3: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] - 1); break;
                    case 4: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] - 2); break;
                    case 5: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] - 1); break;
                    case 6: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] + 2); break;
                    case 7: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] + 1); break;
                }
                for (int l = 0; l < 64 && l != j; l++)
                {
                    if ((X[j] == X[l])&&(Y[j]==Y[l]))
                    {
                        k = true;
                    }
                }
                if (X[j] < 9 && X[j] > 0 && Y[j] < 9 && Y[j] > 0 && !k)
                {
                    i = 0;
                    j++;
                    Move(X, Y, i, j);
                }
                else
                {
                    if (!k)
                    {
                        X[j] = 0; Y[j] = 0;
                        i++;
                        if (i < 8)
                        {
                            Move(X, Y, i, j);
                        }
                        else
                        {
                            f = X[j] - X[j - 1];
                            b = Y[j] - Y[j - 1];
                            if ((f == 1) && (b == 2)) { i = 7; j--; }
                            if ((f == 1) && (b == -2)) { i = 1; j--; }
                            if ((f == -1) && (b == 2)) { i = 3; j--; }
                            if ((f == -1) && (b == -2)) { i = 5; j--; }
                            if ((f == 2) && (b == 1)) { i = 2; j--; }
                            if ((f == 2) && (b == -1)) { i = 6; j--; }
                            if ((f == -2) && (b == 1)) { i = 8; j--; }
                            if ((f == -2) && (b == -1)) { i = 4; j--; }
                        }
                    } else
                    {
                        i++;
                        if (i < 8)
                        {
                            Move(X, Y, i, j);
                        }
                        else
                        {
                            f = X[j] - X[j - 1];
                            b = Y[j] - Y[j - 1];
                            if ((f == 1) && (b == 2)) { i = 7; j--; }
                            if ((f == 1) && (b == -2)) { i = 1; j--; }
                            if ((f == -1) && (b == 2)) { i = 3; j--; }
                            if ((f == -1) && (b == -2)) { i = 5; j--; }
                            if ((f == 2) && (b == 1)) { i = 2; j--; }
                            if ((f == 2) && (b == -1)) { i = 6; j--; }
                            if ((f == -2) && (b == 1)) { i = 8; j--; }
                            if ((f == -2) && (b == -1)) { i = 4; j--; }
                        }
                        k = false;
                    }
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы