Читать матрицу из текстового файла в C # - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно прочитать текстовый файл, который содержит матрицу, вместо того, чтобы иметь его в коде, как у меня, но я пытался, и я не могу понять это.У меня есть матрица в текстовом файле, как у меня в коде, но без запятых

Это программа dijkstra, которая читает матрицу, чтобы найти кратчайший путь, спасибо

{

    private static int MinimumDistance(int[] distance, bool[] shortestPathTreeSet, int verticesCount)
    {
        int min = int.MaxValue;
        int minIndex = 0;

        for (int v = 0; v < verticesCount; ++v)
        {
            if (shortestPathTreeSet[v] == false && distance[v] <= min)
            {
                min = distance[v];
                minIndex = v;
            }
        }

        return minIndex;
    }

    private static void Print(int[] distance, int verticesCount)
    {
        Console.WriteLine("Vertex    Distance from source");

        for (int i = 0; i < verticesCount; ++i)
            Console.WriteLine("{0}\t  {1}", i, distance[i]);
    }

    public static void DijkstraAlgo(int[,] graph, int source, int verticesCount)
    {
        int[] distance = new int[verticesCount];
        bool[] shortestPathTreeSet = new bool[verticesCount];

        for (int i = 0; i < verticesCount; ++i)
        {
            distance[i] = int.MaxValue;
            shortestPathTreeSet[i] = false;
        }

        distance[source] = 0;

        for (int count = 0; count < verticesCount - 1; ++count)
        {
            int u = MinimumDistance(distance, shortestPathTreeSet, verticesCount);
            shortestPathTreeSet[u] = true;

            for (int v = 0; v < verticesCount; ++v)
                if (!shortestPathTreeSet[v] && Convert.ToBoolean(graph[u, v]) && distance[u] != int.MaxValue && distance[u] + graph[u, v] < distance[v])
                    distance[v] = distance[u] + graph[u, v];
        }

        Print(distance, verticesCount);
    }

    static void Main(string[] args)
    {
        int[,] graph =  {
                     { 0, 6, 0, 0, 0, 0, 0, 9, 0 },
                     { 6, 0, 9, 0, 0, 0, 0, 11, 0 },
                     { 0, 9, 0, 5, 0, 6, 0, 0, 2 },
                     { 0, 0, 5, 0, 9, 16, 0, 0, 0 },
                     { 0, 0, 0, 9, 0, 10, 0, 0, 0 },
                     { 0, 0, 6, 0, 10, 0, 2, 0, 0 },
                     { 0, 0, 0, 16, 0, 2, 0, 1, 6 },
                     { 9, 11, 0, 0, 0, 0, 1, 0, 5 },
                     { 0, 0, 2, 0, 0, 0, 6, 5, 0 }
                        };

        DijkstraAlgo(graph, 0, 9);
    }
}

}

и вот матрица текстового файла:

0 6 8 12 0 0 0 0 0 0
6 0 0 5 0 0 0 0 0 0
8 0 0 1 0 0 0 0 0 0
12 5 1 0 9 10 14 16 15 0
0 0 0 9 0 0 3 0 0 0
0 0 0 10 0 0 0 0 13 0
0 0 0 14 3 0 0 3 0 6
0 0 0 16 0 0 3 0 1 4
0 0 0 15 0 13 0 1 0 7
0 0 0 0 0 0 6 4 70

1 Ответ

0 голосов
/ 25 мая 2018

Если я вас правильно понимаю.

Вы ищете способ прочитать разделенный пробел int s из файла и преобразовать его в многомерный (квадратный) массив int.например, int[,]

Вы можете сделать что-то вроде этого

Учитывая

public static class Extensions
{
   public static T[,] ToRectangularArray<T>(this IReadOnlyList<T[]> arrays)
   {
      var ret = new T[arrays.Count, arrays[0].Length];
      for (var i = 0; i < arrays.Count; i++)
         for (var j = 0; j < arrays[0].Length; j++)           
            ret[i, j] = arrays[i][j];
      return ret;
   }
}

Использование

var someArray = File.ReadAllLines("myAwesomeFile")   // read from File
                    .Select(x => x.Split(' ').Select(int.Parse).ToArray()) // split line into array of int
                    .ToArray()                       // all to array
                    .ToRectangularArray();           // send to multidimensional array
...