【问题标题】:How to print spiral array PHP如何打印螺旋阵列PHP
【发布时间】:2014-08-10 22:11:39
【问题描述】:

我有数组和这个函数

$array = array(array(00,01,02,03), array(10,11,12,13)​​, array(20,21,22,23));

function spiral($xSize, $ySize, array $matrix) {
$k = 0;
$l = 0;
$xSize--;
$ySize--;

while ($k <= $xSize && $l <= $ySize) {
    for ($i = $l; $i <= $ySize; ++$i) {
        print($matrix[$k][$i] + " ");
    }
    $k++;

    for ($i = $k; $i <= $xSize; ++$i) {
        print($matrix[$i][$ySize] + " ");
    }
    $ySize--;

    for ($i = $ySize; $i >= $l; --$i) {
        print($matrix[$xSize][$i] + " ");
    }
    $xSize--;

    for ($i = $xSize; $i >= $k; --$i) {
        print($matrix[$i][$l] + " ");
    }
    $l++;
}
}

但不工作。函数必须返回 this 00 01 02 03 13 23 22 21 20 10 11 12

但是返回这个 01 23 13 23 22 21 20 10 11 12 11

【问题讨论】:

  • 这个函数怎么调用?
  • spiral(4, 5, array),其中 4 为行,5 为列,数组向上
  • $matrix 是一个一维数组,但您使用$matrix[$k][$i] 访问多个维度。
  • true,但现在返回这个 01 23 13 23 22 21 20 10 11 12 11 for $array = array(array(00,01,02,03), array(10,11,12, 13), 数组(20,21,22,23));
  • 请用这个新代码更新您的问题,添加当前输出并将 30,31,32,33,34 部分再次添加到数组中。

标签: php


【解决方案1】:

我有一个更好的解决方案。 以下是打印螺旋阵列的方法:

function printSpiralArray($xSize, $ySize, $matrix){
    $printed = [];
    $numElems = $xSize*$ySize;
    $pos = [0,-1];
    $direction = 0;
    for($i=0;$i<$numElems;$i++){
        $checkPos = $pos;
        switch($direction%4){
            case 0:
                $checkPos[1]++;
            break;
            case 1:
                $checkPos[0]++;
            break;
            case 2:
                $checkPos[1]--;
            break;
            case 3:
                $checkPos[0]--;
            break;
        }
        if($checkPos[0]>=$xSize || $checkPos[1]>=$ySize || $checkPos[0]<0 || $checkPos[1]<0 || in_array($checkPos[0].'_'.$checkPos[1],$printed)){
            $direction++;
            $i--;
            continue;
        }
        $pos = $checkPos;
        echo $matrix[$pos[0]][$pos[1]]."\t";
        $printed[] = $pos[0].'_'.$pos[1];
    }
}

下面是如何构建一个给定大小的螺旋阵列:

function getSpiralArray($size){
    $matrix = [];
    $numElems = $size*$size;
    $pos = [0,-1];
    $direction = 0;
    $num = 1;
    for($i=0;$i<$numElems;$i++){
        $checkPos = $pos;
        switch($direction%4){
            case 0:
                $checkPos[1]++;
            break;
            case 1:
                $checkPos[0]++;
            break;
            case 2:
                $checkPos[1]--;
            break;
            case 3:
                $checkPos[0]--;
            break;
        }
        if($checkPos[0]>=$size || $checkPos[1]>=$size || $checkPos[0]<0 || $checkPos[1]<0 || isset($matrix[$checkPos[0]][$checkPos[1]])){
            $direction++;
            $i--;
            continue;
        }
        $pos = $checkPos;
        $matrix[$pos[0]][$pos[1]] = $num;
        $num++;

    }
    return $matrix;
}

【讨论】:

    【解决方案2】:

    你的功能:

    function spiral($xSize, $ySize, array $matrix) {
        $m = 0;
        $n = 0;
        $xSize--;
        $ySize--;
    
        while ($m <= $xSize && $n <= $ySize) {
            for ($i = $n; $i <= $ySize; ++$i) {
                print($matrix[$m][$i] . " ");
            }
            $m++;
            for ($i=$m; $i <= $xSize ; $i++) { 
                print($matrix[$i][$ySize] . " ");
            }
            $ySize--;
            for ($i=$ySize; $i >= $n ; $i--) { 
                print($matrix[$xSize][$i] . " ");
            }
            $xSize--;
            for ($i=$xSize; $i >= $m ; $i--) { 
                print($matrix[$i][$n] . " ");
            }
            $n++;
        }
    }
    

    【讨论】:

    • 你试试:spiral(3,4, $array);
    • 我在 (4,4,$array) 的 localhost 中输出:00 01 02 03 13 23 33 32 31 30 20 10 11 12 22 21。我认为您打印的是数字而不是字符串跨度>
    【解决方案3】:

    您可以使用此处讨论的代码的略微修改版本: getting a total count arrays of a multi-dimentional array

    我修改后的版本如下所示:

    Class CountArrays{
        public $elements = array();
    
        function count(array $array){
            foreach($array as $entry){
                if(is_array($entry){
                    $this->count++;
                    $this->count($entry);
                } else {
                    $this->elements[] = $entry;
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多