圆圈算法

$num = $quan = $direct = 0;
$arr = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
$result = array();

while(1) {
    //取一个数
    $key = get_one($arr,$result);

    //方向只有4个 0(左),1(右),2(上),3(下) 去摸求余可得
    $result[$key] = $direct % 4;
    if($num==0) {
        $num++;
        continue;
    }
    $tmp = $num;
    //取num个数标志第二个方向
    $direct++;
    for(;$tmp>0;$tmp--) {
        // 取数
        $key = get_one($arr, $result);
        $result[$key] = $direct % 4;    
    }
    $direct++;
    //再取一次num个数标志第三个方向
    $tmp = $num;
    for(;$tmp>0;$tmp--) {
        // 取数
        $key = get_one($arr, $result);
        $result[$key] = $direct % 4;    
    }
    $num++;
    $quan++;
}

//取一个数
function get_one(&$arr, &$result)
{
    $value = array_shift($arr);
    if (!$value) {
        print_r($result);
        exit;
    }
    return $value;
}

结果

Array
(
    [1] => 0
    [2] => 0
    [3] => 1
    [4] => 2
    [5] => 2
    [6] => 3
    [7] => 3
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 1
    [12] => 1
    [13] => 1
    [14] => 2
    [15] => 2
    [16] => 2
)

image

原文地址:https://www.cnblogs.com/jdhu/p/4259896.html