Написать программу, выводящую путь коня(клетка за клеткой) с помощью рекурсии - 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;
}
}
}
}
}
}