【问题标题】:PHP rotate matrix counter-clockwisePHP逆时针旋转矩阵
【发布时间】:2013-06-08 08:24:56
【问题描述】:

我正在解决一个更大的问题,我需要逆时针旋转一个二维数组。

所以如果我有这个矩阵:

1 2 3 4
1 2 3 4
3 4 5 6
3 4 5 6

旋转后会是:

4 4 6 6
3 3 5 5
2 2 4 4
1 1 3 3

我找到了一个solution 顺时针旋转它:

<?php    
$a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
$b = array(); //result

while(count($a)>0)
{
    $b[count($a[0])-1][] = array_shift($a[0]);
    if (count($a[0])==0)
    {
         array_shift($a);
    }
}
?>

问题是即使a 是一维的或只有一个元素,它也必须工作。

所以,1 2 3 4 将变为:

4
3
2
1

【问题讨论】:

    标签: php arrays matrix


    【解决方案1】:
    $b = call_user_func_array(
        'array_map',
        array(-1 => null) + array_map('array_reverse', $a)
    );
    

    我将把它作为练习留给读者了解它是如何工作的

    【讨论】:

    • 太棒了:)。感谢您的回答。
    • 我试图弄清楚为什么array_map-1 =&gt; null 函数(或实际上是什么函数)将每一行的第n 个元素组合在一起...... ideone.com/ES75XJ 你能解释一下吗?
    • @Cristy 请参阅手册中的示例“Creating an array of arrays”。您的代码实际上调用了array_map(null, [2,1], [3,2], [4,3]),它返回[[2,3,4],[1,2,3]]
    • 有趣的方法!如果您也想顺时针旋转,也可以将array_map('array_reverse', $a) 替换为$a
    • @MattFletcher 实际上,用$a 替换array_map('array_reverse', $a) 将顺时针旋转,但也会沿y 轴反射。要仅顺时针旋转,请将array_map('array_reverse', $a) 替换为array_reverse($a)
    【解决方案2】:

    这是一个同时进行顺时针和逆时针矩阵旋转的解决方案:

    $a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
    $b = $a; //result
    
    $clockwise = false;  // toggle for clockwise / counter-clockwise
    
    $rows = count($a);
    $columns = ($rows > 0) ? count($a[0]) : 0;
    
    for ($y = 0; $y < $rows; $y++) {
      for ($x = 0; $x < $columns; $x++) {
        $newX = $clockwise ? $y                  : ($rows - 1) - $y;
        $newY = $clockwise ? ($columns - 1) - $x : $x;
        $b[$newX][$newY] = $a[$x][$y];
      }
    }
    

    【讨论】:

      【解决方案3】:

      这是一种递归方式:

                  $m = array();
                  $m[0] = array('a', 'b', 'c');
                  $m[1] = array('d', 'e', 'f');
                  $m[2] = array('g', 'h', 'i');
                  $newMatrix = array();
      
                  function rotateMatrix($m, $i = 0, &$newMatrix)
                  {
                      foreach ($m as $chunk) {
                          $newChunk[] = $chunk[$i];
                      }
                      $newMatrix[] = array_reverse($newChunk);
                      $i++;
      
                      if ($i < count($m)) {
                          rotateMatrix($m, $i, $newMatrix);
                      }
                  }
      
                  rotateMatrix($m, 0, $newMatrix);
                  echo '<pre>';
                  var_dump($newMatrix);
                  echo '<pre>';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2020-07-08
        • 2019-03-25
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多