Модель абелевой песочницы в PHP - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь сделать абелеву модель песочной кучи в PHP. Я начинаю с возможного решения, и оно работает для трехмерного массива, но не работает для 5-мерного массива. Я не уверен, почему возникает следующая проблема.

$pile = array(array(0,1,0),array(0,2,3),array(1,0,1));

Ожидается: 021, 110, 112

Фактический результат: 021, 110, 112

$pile = array(array(0,0,3,0,0),array(0,0,3,0,0),array(3,3,3,3,3),array(0,0,3,0,0),array(0,0,3,0,0));

Ожидаемый: 01010, 12321, 03030, 12321, 01010

Фактический результат: 01010, 12221, 02020, 12221, 01010

PHP Сценарий:

<?php
//$pile = array(array(0,1,0),array(0,2,3),array(1,0,1));
//expected     : 021, 110, 112
//$result = sandpile($pile, 2);

$pile = array(array(0,0,3,0,0),array(0,0,3,0,0),array(3,3,3,3,3),array(0,0,3,0,0),array(0,0,3,0,0));
//expected     : 01010, 12321, 03030, 12321, 01010

$result = sandpile($pile, 5);

function sandpile($pile, $n)
  {
    $total_rows = count($pile);
    $mid_x      = (int) ($total_rows / 2);
    $mid_y      = (int) (count($pile[$mid_x]) / 2);

    $arr_result = array_redistribute($pile, $mid_x, $mid_y, $n);

    return $arr_result;
  }

function array_redistribute($arr_input = array(), $x, $y, $n = 1)
  {
    $arr_input[$x][$y] = $arr_input[$x][$y] + $n;

    // if grains in a cell reaches 4
    if ($arr_input[$x][$y] > 3)
      {
        $arr_input[$x][$y] = 0;

        // increment closest cell
        if(isset($arr_input[$x-1][$y]))
    $arr_input[$x-1][$y] = $arr_input[$x-1][$y] + 1;

    if(isset($arr_input[$x+1][$y]))
    $arr_input[$x+1][$y] = $arr_input[$x+1][$y] + 1;

    if(isset($arr_input[$x ][$y-1]))
    $arr_input[$x ][$y-1] = $arr_input[$x][$y-1] +1;

    if(isset($arr_input[$x][$y+1]))
    $arr_input[$x][$y+1] = $arr_input[$x][$y+1] + 1;

    // if closest cell value > 3
    if(isset($arr_input[$x-1][$y]) && $arr_input[$x-1][$y]>3)
    {
      $arr_input = array_redistribute($arr_input, $x-1, $y, 1);
    }

    if(isset($arr_input[$x+1][$y]) && $arr_input[$x+1][$y]>3)
    {
      $arr_input = array_redistribute($arr_input, $x+1, $y, 1);
    }

    if(isset($arr_input[$x][$y-1]) && $arr_input[$x][$y-1]>3)
    {
      $arr_input = array_redistribute($arr_input, $x, $y-1, 1);
    }

    if(isset($arr_input[$x ][$y+1]) && $arr_input[$x][$y+1]>3)
    {
      $arr_input = array_redistribute($arr_input, $x, $y+1, 1);
    }

    return $arr_input;
  }
?>
...