Program.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace D25._1
  6. {
  7. public class Star
  8. {
  9. public List<Star> Connections = new List<Star>();
  10. public int[] Coords;
  11. public override bool Equals(object obj)
  12. {
  13. var star = obj as Star;
  14. return star != null && EqualityComparer<int[]>.Default.Equals(Coords, star.Coords);
  15. }
  16. public override int GetHashCode()
  17. {
  18. return Coords.GetHashCode();
  19. }
  20. }
  21. class Program
  22. {
  23. static public int Manhattan(int[] a, int[] b)
  24. {
  25. int man = 0;
  26. for (var i = 0; i < a.Length; ++i)
  27. man += Math.Abs(a[i] - b[i]);
  28. return man;
  29. }
  30. static void Main(string[] args)
  31. {
  32. if (args.Length < 1) return;
  33. if (File.Exists(args[0]) == false) return;
  34. List<Star> all = new List<Star>();
  35. var file = File.OpenText(args[0]);
  36. do
  37. {
  38. var line = file.ReadLine();
  39. if (line == null) break;
  40. var coord = line.Split(",").Select(v => int.Parse(v)).ToArray();
  41. var star = new Star()
  42. {
  43. Coords = coord
  44. };
  45. foreach (var a in all)
  46. {
  47. if (Manhattan(a.Coords, star.Coords) > 3) continue;
  48. a.Connections.Add(star);
  49. star.Connections.Add(a);
  50. }
  51. all.Add(star);
  52. } while (true);
  53. file.Close();
  54. HashSet<Star> visited = new HashSet<Star>();
  55. Queue<Star> queue = new Queue<Star>();
  56. int constellations = 0;
  57. while (true)
  58. {
  59. var first = all.Where(a => visited.Contains(a) == false).FirstOrDefault();
  60. if (first == null) break;
  61. constellations++;
  62. queue.Enqueue(first);
  63. while (queue.Count > 0)
  64. {
  65. var s = queue.Dequeue();
  66. visited.Add(s);
  67. foreach (var c in s.Connections)
  68. {
  69. if (visited.Contains(c)) continue;
  70. queue.Enqueue(c);
  71. }
  72. }
  73. }
  74. Console.WriteLine($"The answer is : {constellations}");
  75. }
  76. }
  77. }