Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отсортировать элементы двухмерного массива находящиеся на одной диагонали (http://www.flasher.ru/forum/showthread.php?t=170199)

S.Petrov 20.10.2011 15:12

Отсортировать элементы двухмерного массива находящиеся на одной диагонали
 
Есть двухмерный массив n x m строк вида:

0 | 5 | 10 | 15
1 | 6 | 11 | 16
2 | 7 | 12 | 17
3 | 8 | 13 | 18
4 | 9 | 14 | 19

Нужно преобразовать в массив содержащий список элементов, которые находятся на одной диагонали, например: [0], [1, 5], [2, 6, 10], [3, 7, 11, 15], [4, 8, 12, 16], [9, 13, 17], [14, 18], [9].

Подскажите, пожалуйста, как такое можно сделать или где можно посмотреть, решение.

Genzo 20.10.2011 15:50

Общее кол-во диагоналей = num = (n + m - 1)
Самая длинная диагональ = max = (n <= m) ? n : m;
Код AS3:

var num:uint = (n + m - 1);
var max:uint = (n <= m) ? n : m;
 
var diagArr:Array = [];
for(var k:uint = 0;k<num;k++)
{
    var retArr:Array = [];
    var x:uint = (k > m) ? (k - m - 1) : 0;
    var y:uint = (k <= n) ? k : n;
    var l:uint = (k < max) ? k : 2*max - k;
    for(var i:uint = 0;i<l;i++)
    {
        retArr.push(sourceArr[x+i][y+i]);
    }
    diagArr.push(retArr);
}


S.Petrov 20.10.2011 17:07

Спасибо за отклик. Но все равно что то не получется, может я что не так делаю. Вот попробовал вывести trace
Код AS3:

var n:int = 4;
                        var m:int = 5;
                        var sourceArr:Array = [];
                        var index:int;
                        trace ("sourceArray");
                        for (var ii:int = 0; ii < n; ii++) {
                                sourceArr[ii] = [];
                                for (var jj:int = 0; jj < m; jj++) {
                                        sourceArr[ii][jj] = index;
                                        index++;
                                }
                                trace (sourceArr[ii]);
                        }
 
 
                        var num:uint = (n + m - 1);
                        var max:uint = (n <= m) ? n : m;
 
                        var diagArr:Array = [];
                        for(var k:uint = 0;k<num;k++)
                        {
                                var retArr:Array = [];
                                var x:uint = (k > m) ? (k - m - 1) : 0;
                                var y:uint = (k <= n) ? k : n;
                                var l:uint = (k < max) ? k : 2*max - k;
                                for(var i:uint = 0;i<l;i++)
                                {
                                        retArr.push(sourceArr[x+i][y+i]);
                                }
                                diagArr.push(retArr);
                        }
 
                        trace("\n\rresult\n-------------------------------------\n"+diagArr);

Получилось вот так:
Код AS3:

sourceArray
0,1,2,3,4
5,6,7,8,9
10,11,12,13,14
15,16,17,18,19
 
 
result
-------------------------------------
,1,2,8,3,9,,4,,,,4,,,4,,9


Genzo 20.10.2011 17:51

Это был набросок логики, ну если уж на то пошло, вот :
Код AS3:

var num:uint = (n + m - 1);
                var max:uint = (n <= m) ? n : m;
 
                var diagArr:Array = [];
                for(var k:uint = 0;k<num;k++)
                {
                    var retArr:Array = [];
                    var x:uint = (k >= (m - 1)) ? (k - (m - 1) + 1) : 0;
                    var y:uint = (k <= (n - 1)) ? k : (n - 1);                   
                    var l:uint = (k < max) ? (k + 1) : 2*max - k;
                    for(var i:uint = 0;i<l;i++)
                    {
                        retArr.push(sourceArr[y-i][x+i]);
                    }
                    diagArr.push(retArr);
                }


S.Petrov 20.10.2011 18:29

Большое спасибо, за помощь.


Часовой пояс GMT +4, время: 22:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.