Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.48 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApp4
  8. {
  9.  
  10. public class Edge
  11. {
  12. public readonly Node From;
  13. public readonly Node To;
  14. public Edge(Node first, Node second)
  15. {
  16. this.From = first;
  17. this.To = second;
  18. }//Инцидентность ребра вершине
  19. public bool IsIncident(Node node)
  20. {
  21. return From == node || To == node;
  22. }// если имеется вершина, то возвращается инцидентная ей
  23. public Node OtherNode(Node node)
  24. {
  25. if (!IsIncident(node)) throw new ArgumentException();
  26. if (From == node) return To;
  27. return From;
  28. }
  29. }
  30.  
  31. public class Node
  32. {
  33. readonly List<Edge> edges = new List<Edge>();//Нумерация
  34. public readonly int NodeNumber;
  35.  
  36. public Node(int number)
  37. {
  38. NodeNumber = number;
  39. }
  40. // Св-во позволяющее перечислить все вершины, инцидентные ребру
  41. public IEnumerable<Node> IncidentNodes
  42. {
  43. get
  44. {
  45. return edges.Select(z => z.OtherNode(this));
  46. }
  47. }// перечисление всех ребер, инцидентных данной вершине
  48. public IEnumerable<Edge> IncidentEdges
  49. {
  50. get
  51. {
  52. foreach (var e in edges) yield return e;
  53. }
  54. }
  55. public static Edge Connect(Node node1, Node node2, Graph graph)
  56. {//Чтобы не было возможности присоединить к графу новую вершину, не лежащую в графе
  57. if (!graph.Nodes.Contains(node1) || !graph.Nodes.Contains(node2)) throw new ArgumentException();
  58. var edge = new Edge(node1, node2);// создание ребра,соед-го две вершины
  59. node1.edges.Add(edge);// добавление ребра в коллекцию для каждой вершины
  60. node2.edges.Add(edge);
  61. return edge;
  62. }
  63. public static void Disconnect(Edge edge) // удаление ребра
  64. {
  65. edge.From.edges.Remove(edge);
  66. edge.To.edges.Remove(edge);
  67. }
  68. }
  69.  
  70.  
  71. public class Graph
  72. {
  73. private Node[] nodes;
  74. // дание графа
  75. public Graph(int nodesCount)
  76. {
  77. nodes = Enumerable.Range(0, nodesCount).Select(z => new Node(z)).ToArray();
  78. }
  79.  
  80. public int Length { get { return nodes.Length; } }
  81. // индексация
  82. public Node this[int index] { get { return nodes[index]; } }
  83. // список всез вершин в графе
  84. public IEnumerable<Node> Nodes
  85. {
  86. get
  87. {
  88. foreach (var node in nodes)
  89. yield return node;
  90. }
  91. }
  92.  
  93. public void Connect(int index1, int index2)
  94. {
  95. Node.Connect(nodes[index1], nodes[index2], this);
  96. }
  97. // удаление ребра
  98. public void Delete(Edge edge)
  99. {
  100. Node.Disconnect(edge);
  101. }
  102. // перечисление всех ребер графа
  103. public IEnumerable<Edge> Edges
  104. {
  105. get
  106. {
  107. return nodes.SelectMany(z => z.IncidentEdges).Distinct();
  108. }
  109. }
  110.  
  111. public static Graph MakeGraph(params int[] incidentNodes) // создает граф
  112. {
  113. var graph = new Graph(incidentNodes.Max() + 1);
  114. for (int i = 0; i < incidentNodes.Length - 1; i += 2)
  115. graph.Connect(incidentNodes[i], incidentNodes[i + 1]);
  116. return graph;
  117. }
  118.  
  119. public static int[,] MakeMatrix(string[] labyrinth)
  120. {
  121. var incidents = new int[labyrinth.Length, labyrinth[0].Length];// делаем матрица, если участок пустой, то помечаем его как "1", иначе как "0"
  122. for (int i = 0; i < labyrinth.Length; i++)
  123. for (int j = 0; j < labyrinth[i].Length; j++)
  124. {
  125. if (labyrinth[i][j] == ' ')
  126. {
  127. incidents[i, j] = 1;
  128. }
  129. else
  130. incidents[i, j] = 0;
  131. }
  132. return incidents;
  133. }
  134. }
  135.  
  136. public static class Program
  137. {
  138. public static IEnumerable<Node> FindShortestPath(this Graph graph, Node start, Node end)
  139. {
  140. var track = new Dictionary<Node, Node>();
  141. var queue = new Queue<Node>();
  142. queue.Enqueue(start);
  143. track[start] = null; // стартовая вершина
  144. while (queue.Count != 0)
  145. {
  146. var node = queue.Dequeue();
  147. track.ContainsKey(node);
  148. bool endIsFound = false;
  149. foreach (var nextNode in node.IncidentNodes)
  150. {
  151. if (track.ContainsKey(nextNode)) continue;
  152. track[nextNode] = node;// кратчайший путь в некстнод из НОД
  153. queue.Enqueue(nextNode);
  154. if (nextNode == end) endIsFound = true;
  155. }
  156. if (endIsFound) break;
  157. }
  158. if (!track.ContainsKey(end)) return null; // проверка на связность графа
  159. var list = new List<Node>();
  160. while (end != null)
  161. {
  162. list.Add(end);
  163. end = track[end]; // движение по массиву из конца в начало
  164. }
  165. list.Reverse();
  166. return list;
  167. }
  168.  
  169. public static List<int> TransformToGraph(int[,] arr)
  170. {
  171. var list = new List<int>();
  172. for (int i = 0; i < arr.GetLength(0); i++)
  173. {
  174. for (int j = 0; j < arr.GetLength(1); j++)
  175. {
  176. if (arr[i, j] == 1)
  177. {
  178. // TO DO
  179. }
  180. }
  181. }
  182. return list;
  183. }
  184.  
  185. static void Main(string[] args)
  186. {
  187. string[] labyrinth = new string[]
  188. {
  189. "X XXXX",
  190. "XX XX XX X",
  191. "XX X ",
  192. "XX X XXX X",
  193. "X X",
  194. "X X XX X",
  195. "XXXX ",
  196. };
  197.  
  198.  
  199. var arr = Graph.MakeMatrix(labyrinth);
  200. var matrix = TransformToGraph(arr).ToArray();
  201. var graph = Graph.MakeGraph(0, 1, 1, 2, 1, 5, 2, 3, 3, 4, 4, 6, 5, 8, 6, 11, 8, 9, 9, 10, 10, 11, 11, 12, 8, 15, 10, 16, 13, 7, 13, 14, 17, 13,
  202. 15, 19, 16, 21, 17, 25, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 18, 26, 19, 27, 21, 28, 24, 29, 25, 30, 26, 27, 29, 30, 28,
  203. 31, 29, 34, 30, 35, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36);
  204. foreach (var node in graph.FindShortestPath(graph[0], graph[36]))
  205. Console.WriteLine(node.NodeNumber);
  206. Console.ReadKey();
  207. }
  208. }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement