Advertisement
Guest User

Untitled

a guest
Jul 25th, 2022
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.56 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3.  
  4.  
  5. namespace AOCD9
  6. {
  7.  
  8.     // Using struct is important here because we want Points to be a value type. Otherwise it has
  9.     // to be copied when added to a HashSet so it's not added by reference and then later modified.
  10.     public struct Points
  11.     {
  12.         public int PointValue { get; set; }
  13.         public int CoordX { get; set; }
  14.         public int CoordY { get; set; }
  15.  
  16.         public Points(int pointValue, int coordX, int coordY)
  17.         {
  18.             PointValue = pointValue;
  19.             CoordX = coordX;
  20.             CoordY = coordY;
  21.         }
  22.     }
  23.  
  24.     public class Program
  25.     {
  26.         public static void Main()
  27.         {
  28.  
  29.             var stringArray = ConvertInputToStringArray("sample.txt");
  30.             var matrix = SetMatrix(stringArray);
  31.             PrintMatrix(matrix);
  32.             var lowPoints = GetLowPoints(matrix);
  33.             var risk = GetRiskLevel(lowPoints);
  34.             Console.WriteLine($"The risk level is: {risk}");
  35.  
  36.             foreach (var item in lowPoints)
  37.             {
  38.                 Console.Write($"Coordinates of the Low Points {item.PointValue}: ");
  39.                 Console.WriteLine(item.CoordX.ToString()+" "+ item.CoordY.ToString());
  40.             }
  41.             var basins = GetBasins(matrix, lowPoints);
  42.             foreach (var basin in basins) {
  43.               Console.WriteLine("Basin points: ");
  44.               foreach (var k in basin) {
  45.                 Console.WriteLine($"{k.CoordX}, {k.CoordY}: {k.PointValue}");
  46.               }
  47.             }
  48.             Console.WriteLine();
  49.  
  50.             var top3 = basins.Select(x => x.Count).OrderByDescending(x => x).Take(3).ToList();
  51.             long finalResult = 1;
  52.             foreach (var item in top3)
  53.             {
  54.                 Console.WriteLine($"item: {item}");
  55.                 finalResult *= item;
  56.             }
  57.             Console.WriteLine($"Final result is: \t{finalResult}");
  58.         }
  59.  
  60.  
  61.         public static string[] ConvertInputToStringArray (string input)
  62.         {
  63.             return File.ReadAllLines(input);
  64.         }
  65.  
  66.         public static int[,] SetMatrix(string[] input)
  67.         {
  68.             int[,] result = new int[input.GetLength(0), input[0].Length];
  69.             for (int row = 0; row < input.GetLength(0); row++)
  70.             {
  71.                 for (int col = 0; col < input[0].Length; col++)
  72.                 {
  73.                     result[row, col] = int.Parse(input[row][col].ToString());
  74.                 }
  75.  
  76.             }
  77.             return result;
  78.         }
  79.  
  80.         public static void PrintMatrix(int[,] matrix)
  81.         {
  82.             for (int row = 0; row < matrix.GetLength(0); row++)
  83.             {
  84.                 for (int col = 0; col < matrix.GetLength(1); col++)
  85.                 {
  86.                     Console.Write(matrix[row,col]);
  87.                 }
  88.                 Console.WriteLine();
  89.             }
  90.         }
  91.  
  92.         public static bool CheckLowPoint (int[,] matrix, int x, int y)
  93.         {
  94.             var up = x - 1;
  95.             var down = x + 1;
  96.             var left = y - 1;
  97.             var right = y + 1;
  98.             if (x == 0) up = 1;
  99.             if (y == 0) left = 1;
  100.             if (y == matrix.GetLength(1)-1) right = matrix.GetLength(1) - 2;
  101.             if (x == matrix.GetLength(0)-1) down = matrix.GetLength(0) - 2;
  102.  
  103.  
  104.             if (matrix[x, y] < matrix[up, y] &&
  105.                 matrix[x, y] < matrix[down, y] &&
  106.                 matrix[x, y] < matrix[x, left] &&
  107.                 matrix[x, y] < matrix[x, right]
  108.                 )
  109.                 return true;
  110.             else return false;
  111.         }
  112.  
  113.  
  114.         public static void GetLowPointsBasinLeft(HashSet<Points> result, int[,] matrix, int x, int y)
  115.         {
  116.             var left = y - 1;
  117.             if (y > 0)
  118.                 left = y - 1;
  119.             else left = y;
  120.             Points curr = new Points(matrix[x, left], x, left);
  121.             while (curr.PointValue != 9 && !result.Contains(curr))
  122.             {
  123.                 result.Add(curr);
  124.                 GetLowPointsBasinDown(result, matrix, curr.CoordX, curr.CoordY);
  125.                 GetLowPointsBasinUp(result, matrix, curr.CoordX, curr.CoordY);
  126.  
  127.                 if (curr.CoordY == 0) break;
  128.                 curr.CoordY--;
  129.                 curr.PointValue = matrix[curr.CoordX, curr.CoordY];
  130.             }
  131.         }
  132.  
  133.  
  134.         public static void GetLowPointsBasinRight(HashSet<Points> result, int[,] matrix, int x, int y)
  135.         {
  136.             var right = y + 1;
  137.             if (y < matrix.GetLength(1) - 1)
  138.                 right = y + 1;
  139.             else right = y;
  140.  
  141.             Points curr = new Points(matrix[x, right], x, right);
  142.             while (curr.PointValue != 9 && !result.Contains(curr))
  143.             {
  144.                 result.Add(curr);
  145.                 GetLowPointsBasinDown(result, matrix, curr.CoordX, curr.CoordY);
  146.                 GetLowPointsBasinUp(result, matrix, curr.CoordX, curr.CoordY);
  147.  
  148.                 if (curr.CoordY == matrix.GetLength(1) - 1) break;
  149.                 curr.CoordY++;
  150.                 curr.PointValue = matrix[curr.CoordX, curr.CoordY];
  151.             }
  152.         }
  153.  
  154.  
  155.  
  156.         public static void GetLowPointsBasinUp(HashSet<Points> result, int[,] matrix, int x, int y)
  157.         {
  158.             int up = x - 1;
  159.             if (x > 0)
  160.                 up = x - 1;
  161.             else up = x;
  162.             Points curr = new Points(matrix[up, y], up, y);
  163.             while (curr.PointValue != 9 && !result.Contains(curr))
  164.             {
  165.                     result.Add(curr);
  166.                     GetLowPointsBasinLeft(result, matrix, curr.CoordX, curr.CoordY);
  167.                     GetLowPointsBasinRight(result, matrix, curr.CoordX, curr.CoordY);
  168.  
  169.                 if (curr.CoordX == 0) break;
  170.                 curr.CoordX--;
  171.                 curr.PointValue = matrix[curr.CoordX, curr.CoordY];
  172.             }
  173.         }
  174.  
  175.         public static void GetLowPointsBasinDown(HashSet<Points> result, int[,] matrix, int x, int y)
  176.         {
  177.             int down = x + 1;
  178.             if (x < matrix.GetLength(0) - 1)
  179.                 down = x + 1;
  180.             else down = x;
  181.             Points curr = new Points(matrix[down, y], down, y);
  182.             while (curr.PointValue != 9 && !result.Contains(curr))
  183.             {
  184.                     result.Add(curr);
  185.                     GetLowPointsBasinLeft(result, matrix, curr.CoordX, curr.CoordY);
  186.                     GetLowPointsBasinRight(result, matrix, curr.CoordX, curr.CoordY);
  187.  
  188.                 if (curr.CoordX == matrix.GetLength(0) - 1) break;
  189.                 curr.CoordX++;
  190.                 curr.PointValue = matrix[curr.CoordX, curr.CoordY];
  191.             }
  192.         }
  193.  
  194.         public static List<HashSet<Points>> GetBasins(int[,] matrix, List<Points> lowPoints)
  195.         {
  196.             List<HashSet<Points>> result = new List<HashSet<Points>>();
  197.             foreach (var point in lowPoints)
  198.             {
  199.                 var x = point.CoordX;
  200.                 var y = point.CoordY;
  201.                 Console.WriteLine($"{x}, {y}");
  202.                 HashSet<Points> basin = new HashSet<Points>();
  203.                 basin.Add(new Points(matrix[x, y], x, y));
  204.  
  205.                 //--------------- lowpoint basin on the left ------------------------------
  206.                 GetLowPointsBasinLeft(basin, matrix, x, y);
  207.  
  208.                 //----------------lowpoint basin on the right------------------------------
  209.                 GetLowPointsBasinRight(basin, matrix, x, y);
  210.  
  211.                 //----------------lowpoint basin on up-------------------------------------
  212.                 GetLowPointsBasinUp(basin, matrix, x, y);
  213.  
  214.                 //----------------lowpoint basin on down-----------------------------------
  215.                 GetLowPointsBasinDown(basin, matrix, x, y);
  216.  
  217.  
  218.                 result.Add(basin);
  219.             }
  220.             return result;
  221.         }
  222.  
  223.         public static List<Points> GetLowPoints (int[,] matrix)
  224.         {
  225.             List<Points> list = new List<Points>();
  226.             for (int row = 0; row < matrix.GetLength(0); row++)
  227.             {
  228.                 for (int col = 0; col < matrix.GetLength(1); col++)
  229.                 {
  230.                     if (CheckLowPoint(matrix, row, col)) list.Add(new Points(matrix[row, col], row, col));
  231.                 }
  232.             }
  233.             return list;
  234.         }
  235.  
  236.  
  237.         public static int GetRiskLevel (List<Points> list)
  238.         {
  239.             int result = 0;
  240.             foreach (var item in list)
  241.             {
  242.                 result += item.PointValue+1;
  243.             }
  244.             return result;
  245.         }
  246.  
  247.     }
  248. }
  249.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement