Untitled

mail@pastecode.io avatar
unknown
csharp
a month ago
3.7 kB
3
Indexable
Never

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics;

class AdventDayThree
{
    static void Main(string[] args)
    {
        string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", "input.txt");

        if (File.Exists(path))
        {
            string[] input = File.ReadAllLines(path);
        //    string[] input = {
        //    "467..114..",
        //    "...*......",
        //    "..35..633.",
        //    "......#...",
        //    "617*......",
        //    ".....+.58.",
        //    "..592.....",
        //    "......755.",
        //    "...$.*....",
        //    ".664.598.."
        //};
            int suma = CalcularSumaPartes(input);
            Console.WriteLine("Suma total: " + suma);
        }
        else
        {
            Console.WriteLine("No sabes ni leer un archivo melon");
        }

        
    }

    static int CalcularSumaPartes(string[] matriz)
    {
        int sumaTotal = 0;
        int filas = matriz.Length;
        int columnas = matriz[0].Length;

        // Direcciones: izquierda, derecha, arriba, abajo y cuatro diagonales
        int[] coordenadaX = { -1, 1, 0, 0, -1, -1, 1, 1 };
        int[] coordenadaY = { 0, 0, -1, 1, -1, 1, -1, 1 };

        bool[,] comprobado = new bool[filas, columnas];

        for (int i = 0; i < filas; i++)
        {
            for (int j = 0; j < columnas; j++)
            {
                if (char.IsDigit(matriz[i][j]) && !comprobado[i, j])
                {

                    // Encontrar el número completo y calcular su suma
                    int numero = ObtenerNumero(matriz, comprobado, i, j, coordenadaX, coordenadaY);
                    sumaTotal += numero;
                  
                   
                }
            }
        }

        return sumaTotal;
    }
    
    //busca el numero completo y lo masrca como comprobado
    static int ObtenerNumero(string[] matriz, bool[,] comprobado, int fila, int columna, int[] coordenadaX, int[] coordenadaY)
    {
        int numero = 0;
        int filas = matriz.Length;
        int columnas = matriz[0].Length;

        Stack<(int, int)> pila = new Stack<(int, int)>();
        pila.Push((fila, columna));
        //tiene algun simbolo distinto de . adyacente
        bool esValido = false; 

        while (pila.Count > 0)
        {
            (int f, int c) = pila.Pop();

            if (comprobado[f, c] || !char.IsDigit(matriz[f][c]))
                continue;

            comprobado[f, c] = true;
            numero = numero * 10 + (matriz[f][c] - '0');

            // comprobacion de simbolo adyacente
            for (int d = 0; d < 8; d++)
            {
                int filaAdyacente = f + coordenadaX[d];
                int columnaAdyacente = c + coordenadaY[d];

                if (filaAdyacente >= 0 && filaAdyacente < filas && columnaAdyacente >= 0 && columnaAdyacente < columnas)
                {
                    if (!char.IsDigit(matriz[filaAdyacente][columnaAdyacente]) && matriz[filaAdyacente][columnaAdyacente] != '.')
                    {
                        esValido = true;
                    }
                    else if (char.IsDigit(matriz[filaAdyacente][columnaAdyacente]) && !comprobado[filaAdyacente, columnaAdyacente])
                    {
                        pila.Push((filaAdyacente, columnaAdyacente));
                    }
                }
            }
        }
        return esValido ? numero : 0;
    }
}

Leave a Comment