commit 4898bea338de3cf8647931f94b3c9b20d40f20d3 Author: Papin Nikolai Date: Sun Apr 28 21:34:56 2024 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a4e05d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +bin +obj +.vscode +.vs diff --git a/EightQueens.cs b/EightQueens.cs new file mode 100644 index 0000000..5c50aa5 --- /dev/null +++ b/EightQueens.cs @@ -0,0 +1,102 @@ +namespace EightQueens; + +public struct Coord(int x, int y) +{ + public int X { get; set; } = x; + public int Y { get; set; } = y; +}; + +public class Board { + + private List Figures {get;set;} = []; + + public bool IsFieldBusy(int x, int y) + { + return Figures.Any(f => x==f.X && y==f.Y); + } + + public void Add(int x, int y) + { + var pos = new Coord(x, y); + + if (IsFieldBusy(x, y)) return; + Figures.Add(pos); + } + + public void Remove(int x, int y) + { + var pos = new Coord(x, y); + Figures.Remove(pos); + } + + public void Clear() + { + Figures.Clear(); + } + + public List GetFigures() + { + return Figures; + } + + public void Draw() + { + for (int x = 0; x < 9; x++) + { + string row = ""; + for (int y = 0; y < 9; y++) + { + if (x + y == 0) + { + row += " "; + } + else if (y == 0) + { + row += $"{x}"; + } + else if (x == 0) + { + row += $"{y}"; + } + else if (IsFieldBusy(x, y)) + { + row += "O"; + } + else + { + row += "#"; + } + row+=" "; + } + Console.WriteLine(row); + } + + } + + public int Count() + { + return Figures.Count; + } + + public bool IsFieldSafe(int row, int col) + { + var figs = Figures.Where(f => !(row==f.X && col==f.Y)).ToList(); + + foreach (var fig in figs) + { + if (fig.X == row || fig.Y == col) return false; + if (Math.Abs(fig.X - row) == Math.Abs(fig.Y - col)) return false; + } + + return true; + } + + public bool IsBoardSafe() + { + foreach (var fig in Figures) + { + if (!IsFieldSafe(fig.X, fig.Y)) return false; + } + return true; + } +} \ No newline at end of file diff --git a/EightQueens.csproj b/EightQueens.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/EightQueens.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..cc1a4d3 --- /dev/null +++ b/Program.cs @@ -0,0 +1,42 @@ +using EightQueens; + +var board = new Board(); + +string[] cmd = []; +bool quit = false; +while (!quit) +{ + board.Draw(); + Console.WriteLine( + $"Действия:\n" + + $"add X Y - добавить ферзя\n" + + $"del X Y - удалить ферзя\n" + + $"clear - очистить доску\n" + + $"issolved - проверить решение задачи\n" + + $"exit - выход\n"); + + var cmdString = Console.ReadLine(); + if (cmdString == null) continue; + cmd = cmdString.Trim().Split(); + + switch (cmd[0]) + { + case "add": + board.Add(int.Parse(cmd[1]), int.Parse(cmd[2])); + break; + case "del": + board.Remove(int.Parse(cmd[1]), int.Parse(cmd[2])); + break; + case "clear": + board.Clear(); + break; + case "issolved": + Console.WriteLine(board.IsBoardSafe() ? "Ферзи в безопасности!" : "Задача не выполняется"); + break; + default: + Console.WriteLine($"Неизвестная команда '{cmd[0]}'"); + break; + } + + Console.WriteLine($"\n=======================\n"); +} \ No newline at end of file