Esempio n. 1
0
        static void Chess(int size = 8)
        {
            var            field        = new int[size, size];
            int            counter      = 1;
            Figure         first_in_row = null;
            Stack <Figure> to_place     = new Stack <Figure>(size);
            Stack <Figure> placed       = new Stack <Figure>(size);

            for (int i = size; i > 0; i--)
            {
                to_place.Push(new Figure(i, 0));
            }
            bool[,] free = new bool[size, size];
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    free[i, j] = true;
                }
            }
            string res;
            long   condition = 0;

            switch (size)
            {
            case 1:
                Console.WriteLine(1);
                return;

            case 2:
            case 3:
                Console.WriteLine(0);
                return;

            case 4:
                condition = (int)ChessSizes.Four;
                break;

            case 5:
                condition = (int)ChessSizes.Five;
                break;

            case 6:
                condition = (int)ChessSizes.Six;
                break;

            case 7:
                condition = (int)ChessSizes.Seven;
                break;

            case 8:
                condition = (int)ChessSizes.Standart;
                break;

            case 9:
                condition = (int)ChessSizes.Nine;
                break;

            case 10:
                condition = (int)ChessSizes.Ten;
                break;

            case 11:
                condition = (int)ChessSizes.Eleven;
                break;

            case 12:
                condition = (int)ChessSizes.Twelve;
                break;

            case 13:
                condition = (int)ChessSizes.Thirteen;
                break;

            case 14:
                condition = (int)ChessSizes.Fourteen;
                break;

            case 15:
                condition = (int)ChessSizes.Fifteen;
                break;

            case 16:
                condition = (int)ChessSizes.Sixteen;
                break;

            case 17:
                condition = (int)ChessSizes.Seventeen;
                break;

            case 18:
                condition = (int)ChessSizes.Eighteen;
                break;

            case 19:
                condition = (long)ChessSizes.Nineteen;
                break;

            case 20:
                condition = (long)ChessSizes.Twenty;
                break;

            case 21:
                condition = (long)ChessSizes.TwentyOne;
                break;

            case 22:
                condition = (long)ChessSizes.TwentyTwo;
                break;

            case 23:
                condition = (long)ChessSizes.TwentyThree;
                break;

            case 24:
                condition = (long)ChessSizes.TwentyFour;
                break;
            }
            while (counter < condition)
            {
                CheckPosition();
            }
            void ToString(int[,] field)
            {
                res = "";
                for (int i = 0; i < size; i++)
                {
                    for (int j = 0; j < size; j++)
                    {
                        if (field[i, j].ToString().Length == 1)
                        {
                            res += " " + field[i, j] + "|";
                        }
                        else
                        {
                            res += field[i, j] + "|";
                        }
                    }
                    res += "\n";
                }
            }

            void CheckPosition()
            {
                if (to_place.Count > 0)//если в стеке ещё есть неразмещённые фигуры
                {
                    var fig = to_place.Pop();
                    for (int i = fig.NextStartPos; i < size; i++)
                    {
                        if (IsFree(i, fig.Val - 1)) //если клетка не закрыта пересечением
                        {
                            PlaceFig(fig, i);       //размещаем фигуру на поле
                            break;
                        }
                    }
                    if (!fig.Placed)
                    {
                        fig.NextStartPos = 0;
                        to_place.Push(fig);
                        RemoveFig();//убираем последнюю выставленную обратно в очередь
                    }
                }
                else
                {
                    ToString(field);
                    Console.WriteLine($"{counter}:\n{res}");
                    RemoveFig();
                    ++counter;
                }
            }

            void RemoveFig()
            {
                var returned = placed.Pop();

                returned.Placed = false;
                field[returned.NextStartPos - 1, returned.Val - 1] = 0;
                to_place.Push(returned);
                first_in_row = returned;
                FreeField();
                OccupeField();
            }

            void OccupeField()
            {
                foreach (var item in placed)
                {
                    FillHorisVert(item.NextStartPos - 1, item.Val - 1);
                    FillDiags(item.NextStartPos - 1, item.Val - 1);
                }
            }

            void FreeField()
            {
                for (int i = 0; i < size; i++)
                {
                    for (int j = 0; j < size; j++)
                    {
                        free[i, j] = true;
                    }
                }
            }

            bool IsFree(int row, int col)
            {
                if (free[row, col])//если свободна
                {
                    return(true);
                }
                return(false);
            }

            void FillHorisVert(int row, int col)
            {
                for (int i = 0; i < size; i++)
                {
                    free[i, col] = false;
                    free[row, i] = false;
                }
            }

            void FillDiags(int row, int col)
            {
                int row_now = row, col_now = col;

                while (row_now >= 0 && row_now < size && col_now >= 0 && col_now < size)
                {
                    free[row_now, col_now] = false;
                    --col_now;
                    --row_now;
                }
                row_now = row;
                col_now = col;
                while (row_now >= 0 && row_now < size && col_now >= 0 && col_now < size)
                {
                    free[row_now, col_now] = false;
                    ++col_now;
                    ++row_now;
                }
                row_now = row;
                col_now = col;
                while (row_now >= 0 && row_now < size && col_now >= 0 && col_now < size)
                {
                    free[row_now, col_now] = false;
                    ++row_now;
                    --col_now;
                }
                row_now = row;
                col_now = col;
                while (row_now >= 0 && row_now < size && col_now >= 0 && col_now < size)
                {
                    free[row_now, col_now] = false;
                    --row_now;
                    ++col_now;
                }
            }

            void PlaceFig(Figure fig, int row_placed)
            {
                field[row_placed, fig.Val - 1] = fig.Val;
                fig.Placed       = true;
                fig.NextStartPos = row_placed + 1;
                placed.Push(fig);
                FillHorisVert(row_placed, fig.Val - 1);
                FillDiags(row_placed, fig.Val - 1);
            }
        }