风车排列

实现一个function foo($num) 完成如下功能

// foo(1) = [[1]];
// foo(2) = [ [1,2]
//            [4,3]  ];
// foo(3) = [ [7,8,9]
//            [6,1,2]
//            [5,4,3] ];
// foo(4) = [ [7,8,9,10]
//            [6,1,2,11]
//            [5,4,3,12]
//            [16,15,14,13] ];
//
// foo(5)....
//
// foo(n)...
//依次类推,组成一个风车型排列

题解

<?php

$num = 10;
$arr = foo($num);
for( $i = 0; $i < $num ; $i ++  ){
    echo implode(", ", $arr[$i]) . "\n";
}

function foo($num){
    $data = [];
    $offset = 1;   //初始偏移量
    $val = 1;
    $starti = ceil($num/2)!=0?ceil($num/2)-1:0;
    $startj = $starti;
    $data[$starti][$startj] = $val++;   //首项值
    while( $offset<=$num && $val<=$num*$num ){

        //顺序横向
        $endj =  $startj+$offset>$num-1?$num-1:$startj+$offset;
        for($j=&$startj;$j<=$endj;$j++){
            $data[$starti][$startj] = $data[$starti][$startj]??$val++;
        }
        $j--;

        //顺序纵向
        $endi =  $starti+$offset>$num-1?$num-1:$starti+$offset;
        for($i=&$starti;$i<$endi;$i++){
            $data[$starti+1][$startj] = $data[$starti+1][$startj]??$val++;
        }
        $offset++;

        //逆序横向
        $endj =  $startj-$offset<0?0:$startj-$offset;
        for($j=&$startj;$j>$endj;$j--){
            $data[$starti][$startj-1] = $data[$starti][$startj-1]??$val++;
        }

        //逆序纵向
        $endi =  $starti-$offset<0?0:$starti-$offset;
        for($i=&$starti;$i>$endi;$i--){
            $data[$starti-1][$startj] = $data[$starti-1][$startj]??$val++;
        }

        $offset++;
    }

    for($i=0;$i<$num;$i++){
        ksort($data[$i]);
    }
    ksort($data);

    return $data;
}

这不是最好的方法,确实是最容易理解的,其他方法以后补充。

posted @ 2019-10-22 22:05  walkingSun  阅读(260)  评论(0编辑  收藏  举报
**/