1
0

Program.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace D6._1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. if (args.Length < 1) return;
  12. if (File.Exists(args[0]) == false) return;
  13. var coordinates = new List<((uint x, uint y) coord, bool isInfinite)>();
  14. var file = File.OpenText(args[0]);
  15. do
  16. {
  17. var line = file.ReadLine();
  18. if (line == null) break;
  19. var cl = line.Split(", ");
  20. coordinates.Add(((uint.Parse(cl[0]), uint.Parse(cl[1])), false));
  21. } while (true);
  22. var area = new int[coordinates.Count];
  23. for (uint x = 0; x < 500; x++)
  24. {
  25. for (uint y = 0; y < 500; y++)
  26. {
  27. var closest = GetClosest(coordinates, x, y);
  28. area[closest]++;
  29. }
  30. }
  31. for (uint i = 0; i < 500; ++i)
  32. {
  33. var x0yi = GetClosest(coordinates, 0, i);
  34. MarkInfinite(coordinates, x0yi);
  35. var xiy0 = GetClosest(coordinates, i, 0);
  36. MarkInfinite(coordinates, xiy0);
  37. var x500yi = GetClosest(coordinates, 500, i);
  38. MarkInfinite(coordinates, x500yi);
  39. var xiy500 = GetClosest(coordinates, i, 500);
  40. MarkInfinite(coordinates, xiy500);
  41. }
  42. int maxArea = 0;
  43. for (int i = 0; i < area.Length; ++i)
  44. {
  45. if (coordinates.ElementAt(i).isInfinite) continue;
  46. if (area[i] > maxArea) maxArea = area[i];
  47. Console.WriteLine($"Area #{i} : {area[i]} (isInfinite : {coordinates.ElementAt(i).isInfinite})");
  48. }
  49. Console.WriteLine($"Answer : {maxArea}");
  50. }
  51. private static int GetClosest(List<((uint x, uint y) coord, bool isInfinite)> coordinates, uint x, uint y)
  52. {
  53. long lowest = int.MaxValue;
  54. int lowestId = 100000;
  55. for (int i = 0; i < coordinates.Count; i++)
  56. {
  57. var coord = coordinates[i];
  58. var manhattan = Math.Abs((int)x - (int)coord.coord.x) + Math.Abs((int)y - (int)coord.coord.y);
  59. if (manhattan < lowest)
  60. {
  61. lowest = manhattan;
  62. lowestId = i;
  63. }
  64. }
  65. return lowestId;
  66. }
  67. private static void MarkInfinite(List<((uint x, uint y) coord, bool isInfinite)> coordinates, int id)
  68. {
  69. var coord = coordinates[id];
  70. coord.isInfinite = true;
  71. coordinates[id] = coord;
  72. }
  73. }
  74. }