Побывать конем на всех клетках шахматной доски - C#

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

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

Задача побывать конем на всех клетках шахматной доски. На каждой клетке можно побывать только 1 раз. Делал через рекурсия. Работает до 45, затем наступает переполнение стека вызовов. Почему?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace chess3
{
    class Program
    {
        struct ind
        {
            public Byte i, j;
        }
        static Byte n1 = 8, n2 = 8;
        static void Main(string[] args)
        {
            Byte[,] matr=new Byte[n1,n2];
            for(Byte i=0;i<n1;i++)
                for(Byte j=0;j<n2;j++)
                {
                    matr[i,j]=0;
                }
            matr[0,0]=1;
            Byte count=1;
            shag(matr, count);
            Console.ReadLine();
        }
        static void shag(Byte[,] matr,Byte count)
        {
            bool flag = false;
            Byte x=0,y=0;
            for(Byte i=0;i<n1;i++)
            {
                for (Byte j = 0; j < n1; j++)
                {
                    if(matr[i,j]==count)
                    {
                        x = i; y = j;
                    }
                }
            }
            ind[] Ind = new ind[n1];
            for (Byte i = 0; i < n1;i++)
            {
                Ind[i].i = x;
                Ind[i].j = y;
            }
            Ind[0].i += 2; Ind[0].j++;
            Ind[1].i += 2; Ind[1].j--;
            Ind[2].i -= 2; Ind[2].j++;
            Ind[3].i -= 2; Ind[3].j--;
            Ind[4].i++; Ind[4].j += 2;
            Ind[5].i++; Ind[5].j -= 2;
            Ind[6].i--; Ind[6].j += 2;
            Ind[7].i--; Ind[7].j -= 2;
            if (count ==64)
            {
                Console.WriteLine("count= " + count);
                for (Byte i = 0; i < n1; i++)
                {
                    for (Byte j = 0; j < n2; j++)
                    {
                        if (matr[i, j] < 10)
                            Console.Write(matr[i, j] + "   ");
                        else
                            Console.Write(matr[i, j] + "  ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine();
            }
            else if(count>63)
            {
 
            }
            else if(count<0)
            {
                Console.WriteLine("Error");
            }
            else
            {
                for (Byte i1 = 0; i1 < 8; i1++)
                {
                    if (Ind[i1].i >= 0 && Ind[i1].i < 8 && Ind[i1].j >= 0 && Ind[i1].j < 8 && matr[Ind[i1].i, Ind[i1].j] == 0)
                    {
                        matr[Ind[i1].i, Ind[i1].j] = (Byte)(count+1);
                        for (Byte i = 0; i < n1; i++)
                        {
                            for (Byte j = 0; j < n2; j++)
                            {
                                if(matr[i,j]==(count+1) && i!=Ind[i1].i && j!=Ind[i1].j)
                                {
                                    matr[i, j] = 0;
                                }
                            }
                        }
                        shag(matr,(Byte)(count+1));
                        flag = true;
                        break;
                    }
                }
                if(flag==false && count>0)
                {
                    shag(matr, (Byte)(count - 1));
                }
            }
            
        }
    }
}

Решение задачи: «Побывать конем на всех клетках шахматной доски»

textual
Листинг программы
ind[] Ind = new ind[n1];

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


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

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

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