|
|
@@ -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];
|