Кой е най-бързият начин да превърнем тези входни данни към 3D масив?


3

Пиша темата отделно а не при темата със задачата от която са входните данни, защото мисля че така ще е по-полезна.

 

Ето ги и примерните входни данни:

 

 

5 3 3

3 4 1 9 1 | 0 1 2 3 8 | 1 2 5 6 7

2 7 3 1 9 | 2 5 5 2 1 | 8 6 3 5 8

1 8 2 1 5 | 9 1 3 8 6 | 4 5 6 3 2

 

Ето го и моят начин.

Проблема идва от там че при голями входни данни - времето на моят начин се увеличава драстично, и не знам дали има по добър метод. Ще съм благодарен ако някой сподели някаква идея или информация по въпроса.

Благодаря за вниманието!




Отговори



4
Да кажем че първия ред е: K M N
for(int i = 0; i < N; i++) { var parts = Console.ReadLine().Split(" | "); for(int j = 0; j < M; j++) { var nums = parts[j].Split(" "); for(int k = 0; k < K; k++) { arr[i, j, k] = int.Parse(nums[k]); } } }
Още по-бърз вариант (без нито една string функция):
for (int i = 0; i < N; i++) { string line = Console.ReadLine(); for (int j = 0; j < M; j++) { for (int k = 0; k < K; k++) { arr[i, j, k] = line[k * 2 + (K * 2 + 2) * j] - '0'; } } } // Работи само с едноцифрени данни

от Nikolay.IT (39117 точки)


0
Аз съм го направил по същия начин, само дето сплитвам по чар('|') и после тримвам... нещо не ми се получи сплитването по стринг, дава ми грешка при компилация... някакъв съвет какво пропускам? Благодаря предварително!

от FeRt1 (2866 точки)

0
Написах ти и още по бърз вариант (с формула)

от Nikolay.IT (39117 точки)



0

 

for (int h = 0; h < height; h++)
{
    string[] line = Console.ReadLine().Split(
        new char[] { ' ', '|' }, StringSplitOptions.RemoveEmptyEntries);
    for (int w = 0; w < width; w++)
    {
        for (int d = 0; d < depth; d++)
        {
            cube[w, h, d] = int.Parse(line[d * width + w]);
        }
    }
}
 
Използвам отмествания, за да индексирам едномерния масив line като двумерен.
 
Едит: Ники ме изпревари с подобно решение :)

от andon (439 точки)