Просмотр полной версии : Отсортировать элементы двухмерного массива находящиеся на одной диагонали
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].
Подскажите, пожалуйста, как такое можно сделать или где можно посмотреть, решение.
Общее кол-во диагоналей = num = (n + m - 1)
Самая длинная диагональ = max = (n <= m) ? n : m;
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
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);
Получилось вот так:
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
Это был набросок логики, ну если уж на то пошло, вот :
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
Большое спасибо, за помощь.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.