Показать сообщение отдельно
  #53 (permalink)  
Старый 08.12.2016, 14:42
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

Та же функция, но заполняем по индексам:
(тестировал с size: 257, 513, 1025, 2049, чем выше size тем медленее работает даынный вариант по сравнению с предыдущим на js, на с++ впринципе это вариан всегда быстрее в 5 раз с маленькими размерами и в 25 раз с большими )
var arr = [],
    sectors = [],
    step = 2,
    size = 9;

var str = '';
for(i = 0; i < size*size; i++) { // fill array
  arr[i] = i+1;
  str+=addZero(''+arr[i], 2);
  if( (i+1) % size === 0 && i !== 0) {
    console.log(str); // draw array
    str = '';
  } else {
    str+=', ';
  }
}

for(i = 0; i < Math.pow(Math.floor(size/step),2); i++) {
  sectors.push(new Array(Math.pow(step+1,2)));
}

var to_arr = 0,
    x, y,
    line_up = Math.floor(size / step),
    is_repeat, k_step;

for( i = 1, j = 0, k = 0; i <= arr.length; i++, j++) {
  x = Math.floor( i % size );
  y = Math.floor( (i-1) / size ); 
  
  k_step = k == step && k != 0;
  is_repeat = k_step && y != 0 && y!=(size-1); 
  
  if(j != step || j == 0) {
    sectors[to_arr][j+k*(step+1)] = i;
    if(is_repeat) {
      sectors[to_arr+line_up][j] = i;
    }
  }
  
  if(j == step && j != 0) {
    sectors[to_arr][j+k*(step+1)] = i;
    if(is_repeat) {
      sectors[to_arr+line_up][j] = i;
    }
    if(x!=0) {
      sectors[to_arr+1][j+k*(step+1)-step] = i;
      if(is_repeat) {
        sectors[to_arr+line_up+1][j-step] = i;
      }
    }
    to_arr++;
    j = 0;
  }
  
  if(x==0) {
    to_arr = (Math.floor(y/step)-(is_repeat?1:0)) * line_up+(k_step?line_up:0);
    k = k_step?1:k + 1;
    j=-1;
  }
}
console.log(sectors);

function addZero(str,length) { // add 0 to fill str length
  while(str.length < length) {
    str = '0'+str;
  }
  return str;
}

Последний раз редактировалось Brook, 13.12.2016 в 18:44.
Ответить с цитированием