首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 二維陣列尋找連續數字 (橫向、縱向、對角線)

     編輯:PHP 綜合知識

類似連連看/五子棋判邏輯,在二維數字陣列中尋找連續 3 個以上的相同數字。本文提供橫向、縱向、左斜 (/)、右斜 (\) 四個方向的檢測函數,採用座標映射與陣列索引技巧,適合遊戲邏輯、圖像識別預處理等場景。

資料結構與主流程

$data = [
    ['01','02','18','29','31','32'],
    ['02','09','11','22','24','27'],
    ['07','16','26','27','29','31'],
    ['04','05','07','10','13','25'],
    ['02','04','05','08','19','22'],
    ['03','04','15','25','26','30'],
    ['01','03','06','12','16','32'],
    ['01','05','14','17','22'],
];

$h = $v = $l = $r = [];
checkAll($data);
print_r(compact('h','v','l','r'));

function checkAll($grid) {
    $rows = count($grid);
    for ($r = 0; $r < $rows; $r++) {
        checkHorizontal($grid[$r], $r);
        if ($r > 0) {
            checkVertical($grid, $r);
            checkDiagL($grid, $r); // /
            checkDiagR($grid, $r); // \
        }
    }
}

四個方向檢測實作

// 橫向 (同一行)
function checkHorizontal($row, $rowIdx) {
    global $h;
    $found = false;
    for ($c = 2; $c < count($row); $c++) {
        if ($row[$c] - $row[$c-2] == 2 && $row[$c] - $row[$c-1] == 1) { // 連續遞增 1
            if (!$found) { $h[$rowIdx] = [$row[$c-2], $row[$c-1], $row[$c]]; $found = true; }
            else { $h[$rowIdx][] = $row[$c]; }
        }
    }
}

// 縱向 (同一列)
function checkVertical($grid, $rowIdx) {
    global $v;
    $cols = count($grid[0]);
    for ($c = 0; $c < $cols; $c++) {
        $val = $grid[$rowIdx][$c];
        if (isset($grid[$rowIdx-1][$c]) && $grid[$rowIdx-1][$c] == $val &&
            isset($grid[$rowIdx+1][$c]) && $grid[$rowIdx+1][$c] == $val) {
            $key = "$rowIdx-$c";
            if (!isset($v[$key])) {
                $v[$key] = [[$rowIdx-1,$val], [$rowIdx,$val], [$rowIdx+1,$val]];
            } else {
                $v[$key][] = [$rowIdx+1,$val];
            }
            // 繼續向下檢查更長序列
            for ($r = $rowIdx+2; $r < count($grid); $r++) {
                if (isset($grid[$r][$c]) && $grid[$r][$c] == $val) $v[$key][] = [$r,$val];
                else break;
            }
        }
    }
}

// 左斜 / (右上到左下)
function checkDiagL($grid, $rowIdx) {
    global $l;
    // 以 (rowIdx, c) 為中點,檢查 (rowIdx-1, c+1) 和 (rowIdx+1, c-1)
    // 實作略,邏輯同縱向,座標變換為 row±1, col∓1
}

// 右斜 \ (左上到右下)
function checkDiagR($grid, $rowIdx) {
    global $r;
    // 座標變換 row±1, col±1
}

關鍵演算法技巧

  • 座標編碼為鍵:"$row-$col" 唯一標識一條線,避免重複記錄。
  • 差值判斷連續:已排序數組中 $arr[$i] - $arr[$i-2] == 2 等價於連續三數。
  • 邊界檢查:isset($grid[$r][$c]) 防止不規則陣列越界。

通用化改良

function findSequences(array $grid, $minLen = 3, $directions = ['h','v','l','r']) {
    // 返回 [方向 => [序列1, 序列2...]],序列為 [[row,col,val], ...]
    // 使用統一的向量遍歷:[0,1] 橫、[1,0] 縱、[1,1] 右斜、[1,-1] 左斜
    // 適合任意大小、任意數值類型 (支援字串比較)
}

完整通用版代碼較長,建議參考開源專案如 php-connect-four、tic-tac-toe-php 的判邏輯模組。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved