Ver código fonte

D6.1 au propre

bastien.monsarrat 7 anos atrás
pai
commit
8e29923f91
2 arquivos alterados com 38 adições e 22 exclusões
  1. 37 21
      D6.1/Program.cs
  2. 1 1
      D6.1/Properties/launchSettings.json

+ 37 - 21
D6.1/Program.cs

@@ -9,8 +9,9 @@ namespace D6._1
     {
         static void Main(string[] args)
         {
-            if (args.Length < 1) return;
+            if (args.Length < 2) return;
             if (File.Exists(args[0]) == false) return;
+            if (uint.TryParse(args[1], out uint size) == false) return;
 
             var coordinates = new List<((uint x, uint y) coord, bool isInfinite)>();
             var file = File.OpenText(args[0]);
@@ -26,17 +27,31 @@ namespace D6._1
 
             var area = new int[coordinates.Count];
 
-            for (uint x = 0; x < 500; x++)
+            fillMapArea(size, coordinates, area);
+
+            flagPointOnEdges(size, coordinates);
+
+            int maxArea = findMaxCoveredArea(coordinates, area);
+
+            Console.WriteLine($"Answer : {maxArea}");
+        }
+
+        private static int findMaxCoveredArea(List<((uint x, uint y) coord, bool isInfinite)> coordinates, int[] area)
+        {
+            int maxArea = 0;
+            for (int i = 0; i < area.Length; ++i)
             {
-                for (uint y = 0; y < 500; y++)
-                {
-                    var closest = GetClosest(coordinates, x, y);
+                if (coordinates.ElementAt(i).isInfinite) continue;
 
-                    area[closest]++;
-                }
+                if (area[i] > maxArea) maxArea = area[i];
             }
 
-            for (uint i = 0; i < 500; ++i)
+            return maxArea;
+        }
+
+        private static void flagPointOnEdges(uint size, List<((uint x, uint y) coord, bool isInfinite)> coordinates)
+        {
+            for (uint i = 0; i < size; ++i)
             {
                 var x0yi = GetClosest(coordinates, 0, i);
                 MarkInfinite(coordinates, x0yi);
@@ -44,30 +59,31 @@ namespace D6._1
                 var xiy0 = GetClosest(coordinates, i, 0);
                 MarkInfinite(coordinates, xiy0);
 
-                var x500yi = GetClosest(coordinates, 500, i);
-                MarkInfinite(coordinates, x500yi);
+                var xsizeyi = GetClosest(coordinates, size, i);
+                MarkInfinite(coordinates, xsizeyi);
 
-                var xiy500 = GetClosest(coordinates, i, 500);
-                MarkInfinite(coordinates, xiy500);
+                var xiysize = GetClosest(coordinates, i, size);
+                MarkInfinite(coordinates, xiysize);
             }
+        }
 
-            int maxArea = 0;
-            for (int i = 0; i < area.Length; ++i)
+        private static void fillMapArea(uint size, List<((uint x, uint y) coord, bool isInfinite)> coordinates, int[] area)
+        {
+            for (uint x = 0; x < size; x++)
             {
-                if (coordinates.ElementAt(i).isInfinite) continue;
-
-                if (area[i] > maxArea) maxArea = area[i];
+                for (uint y = 0; y < size; y++)
+                {
+                    var closest = GetClosest(coordinates, x, y);
 
-                Console.WriteLine($"Area #{i} : {area[i]} (isInfinite : {coordinates.ElementAt(i).isInfinite})");
+                    area[closest]++;
+                }
             }
-
-            Console.WriteLine($"Answer : {maxArea}");
         }
 
         private static int GetClosest(List<((uint x, uint y) coord, bool isInfinite)> coordinates, uint x, uint y)
         {
             long lowest = int.MaxValue;
-            int lowestId = 100000;
+            int lowestId = 0;
             for (int i = 0; i < coordinates.Count; i++)
             {
                 var coord = coordinates[i];

+ 1 - 1
D6.1/Properties/launchSettings.json

@@ -2,7 +2,7 @@
   "profiles": {
     "D06.1": {
       "commandName": "Project",
-      "commandLineArgs": "\"D:\\adv\\Adv2018\\D6.1\\input.txt\""
+      "commandLineArgs": "\"D:\\adv\\Adv2018\\D6.1\\input.txt\" 500"
     }
   }
 }