>  기사  >  백엔드 개발  >  PHP에서 스네이크 행렬, 루프 행렬, 디지털 나선형 행렬을 구현하는 방법에 대한 자세한 그래픽 설명

PHP에서 스네이크 행렬, 루프 행렬, 디지털 나선형 행렬을 구현하는 방법에 대한 자세한 그래픽 설명

墨辰丷
墨辰丷원래의
2018-05-22 10:04:181447검색

이 글에서는 주로 뱀 행렬, 루프 행렬, 디지털 나선 행렬을 PHP에서 구현하는 방법을 소개합니다. 구체적인 예를 바탕으로 뱀 행렬, 루프 행렬, 디지털 나선 행렬의 개념과 표현 방법, PHP 구현 기술을 분석합니다. 친구들은 다음과 같이

세부 정보를 참조할 수 있습니다.

루프 행렬은 처음부터 시작하여 위쪽, 오른쪽, 아래쪽, 왼쪽의 순서로 계속 증가하는 행렬 시퀀스를 나타냅니다. 예:

1 2 3
8 9 4
7 6 5
.

이제 요구 사항:

입력: m, n, 각각 행과 열 수를 나타냄
출력: m * n의 루프 행렬

예:

입력:

7 8

출력:

1 2 3 4 5 6 7 8
26 27 28 29 30 31 32 9
25 44 45 46 47 48 33 10
24 43 54 57 56 49 34 11
23 42 53 52 51 50 35 12
22 41 40 39 38 37 36 13
21 20 19 18 17 16 15 14

다음 PHP를 사용하여 구현합니다. 여기서는 함수 호출로 캡슐화합니다.

첫 번째 아이디어

위쪽, 오른쪽, 아래쪽, 왼쪽 순서로 직접 탐색하고 탐색 레이어 수를 계산합니다. and it's OK

function snake($row = 5, $col = 5)
{
  // 结果集
  $res = array();
  // 初始值
  $start = 1;
  // 当前遍历层数
  $flag = intval(($row + 1) / 2);
  for ($i = 1; $i <= $flag; $i++) {
    $startX = $i - 1;
    $startY = $i - 1;
    $width = $col - $i + 1;
    $height = $row - $i + 1;
    // 上
    for ($u = $startY; $u < $width; $u++) {
      $res[$startX][$u] = $start;
      $start += 1;
    }
    // 右
    for ($r = $startX + 1; $r < $height; $r++) {
      $res[$r][$u-1] = $start;
      $start += 1;
    }
    // 下
    for ($d = $u - 1 - 1; $d >= $startY; $d--) {
      $res[$r-1][$d] = $start;
      $start += 1;
    }
    // 左
    for ($l = $r - 1 - 1; $l >= $startX + 1; $l--) {
      $res[$l][$d+1] = $start;
      $start += 1;
    }
  }
  // 输出
  for ($i = 0; $i < $row; $i++) {
    for ($j = 0; $j < $col; $j++) {
      echo $res[$i][$j] . " ";
    }
    echo "<br />";
  }
}
snake(7, 8);

두 번째 아이디어

이 아이디어는 첫 번째 아이디어와 비슷하지만 잠시 동안 모든 것을 순회한 다음 위쪽 오른쪽 아래 왼쪽 플래그 비트를 사용하여 현재를 판단하고 수정합니다. 그리고 while에서 if를 사용하여 플래그 위치를 판단하기 위해 이에 대한 코드를 게시하지 않겠습니다. 세 번째 아이디어

반복자를 사용하여 방향을 제어한 다음 m * n 루프를 수행하여 여부를 결정합니다. width, height, isset 등을 판단해서 돌려보면 아이디어도 훌륭하고, 코드량이 대폭 줄어들어 이 방법을 생각하지 못했다는 것을 알 수 있습니다. .

/* *
 * @param $w : 宽
 * @param $h : 高
 * @param $s : 起始数字
 * @param $x, $y : 起始位置坐标 只能从四顶点开始
 * @param $r :方向 默认顺时间 false为逆时针
 *
 */
function print_matrix($w, $h, $s = 1, $l = 1, $x = 0, $y = 0, $r = true) {
  // 表示四个方向
  $R = array(array(1, 0), array(0, 1), array(-1, 0), array(0, -1));
  !$r && $R = array_reverse($R);
  // 创建一个无限迭代器
  $iterator = new InfiniteIterator(new ArrayIterator($R));
  $iterator->rewind();
  list($_x, $_y) = $iterator->current();
  $result = [];
  $result[$x][$y] = $s;
  for ($i = $s+1; $i < ($s + $w * $h); $i++) {
    $new_x = $x + $_x;
    $new_y = $y + $_y;
    if (0 <= $new_x && 0 <= $new_y && $new_x < $w && $new_y < $h && !isset($result[$new_x][$new_y])) {
      $result[$new_x][$new_y] = $i;
      $x = $new_x;
      $y = $new_y;
    } else {
      $iterator->next();
      list($_x, $_y) = $iterator->current();
      $i--;
    }
  }
  // 打印
  for ($i = 0; $i < $h; $i++) {
    for ($j = 0; $j < $w; $j++) {
      echo $result[$j][$i], "\t";
    }
    echo "<br />";
  }
}

관련 권장 사항:

PHP가 2차원 배열을 작동하는 방법

Matrix

Transpose
PHP에서 시계 달성 현명한 인쇄

Matrix

(SpiralMatrix ) 메서드 예제
2차원 배열의

matrix

전치 연산을 구현하는 PHP의 메서드 및 사례

위 내용은 PHP에서 스네이크 행렬, 루프 행렬, 디지털 나선형 행렬을 구현하는 방법에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.