zoukankan      html  css  js  c++  java
  • 风车排列

    实现一个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]) . "
    ";
    }
    
    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;
    }
    

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

  • 相关阅读:
    NAND FLASH扇区管理
    ECC内存校验算法
    实时数据库简介
    windows标准控件
    PLC一些资料
    at命令
    Vi 常用命令列表
    PHP继承及实现
    Mongodb php扩展及安装
    Linux下jdk1.6安装指引
  • 原文地址:https://www.cnblogs.com/followyou/p/11722970.html
Copyright © 2011-2022 走看看