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); } }