Я пытаюсь сделать абелеву модель песочной кучи в 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;
}
?>