面试题-二维矩阵算法题

在这里插入图片描述

实现代码:

<?php
//1、对于点(m,n),统计周边格子“1”的数量,记为N(m,n)
//$arr = [
//    [0, 1, 1, 1],
//    [1, 0, 0, 0],
//    [0, 1, 1, 1],
//    [1, 1, 0, 0],
//];

$arr = init(4, 4);
/**
 * 生成随机二维数组
 * @param int $x
 * @param int $y
 * @return array
 */
function init($x = 0, $y = 0)
{
    $arr = [];
    //判断输入数据是否大于0且为正数
    if (floor($x) != $x) {
        exit("不是正整数!");
    }

    //x控制外循环层数,y控制内循环次数
    for ($i = 0; $i < $x; $i++) {
        for ($j = 0; $j < $y; $j++) {
            $arr[$i][$j] = (int) round(lcg_value());
        }
    }
    return $arr;
}


/**
 * 生成新矩阵主方法入口
 * @param $arr
 */
function newArr($arr)
{
    $new_arr = [];
    foreach ($arr as $out_key => $out_value) {
        foreach ($out_value as $in_key => $in_value) {
            //统计当前坐标四周的值为1的总和
            $sum = sum($arr, $out_key, $in_key);
            //生成新矩阵当前新坐标值
            $new_arr[$out_key][$in_key] = newCurrentNum($in_value, $sum);
        }
    }
    return $new_arr;
}

echo '矩阵变换前:<br>';
for ($i = 0; $i < count($arr); $i++) {
    for ($j = 0; $j < count($arr[$i]); $j++) {
        echo $arr[$i][$j] . '&nbsp';
    }
    echo '<br>';
}

echo '矩阵变换后:<br>';
$new_arr = newArr($arr);
for ($i = 0; $i < count($new_arr); $i++) {
    for ($j = 0; $j < count($new_arr[$i]); $j++) {
        echo $new_arr[$i][$j] . '&nbsp';
    }
    echo '<br>';
}

/**
 * 统计四周值总和
 *
 * 根据行列获取四周坐标值
 * $x 行坐标
 * $y 列坐标
 */
function sum($arr, $x, $y)
{
    //啥也不用管,直接先盘他

    //当前坐标正对上边坐标值
    $up = $arr[$x - 1][$y] ?? 0;
    //当前坐标正对上边右侧坐标值
    $up_right = $arr[$x - 1][$y - 1] ?? 0;
    //当前坐标正对上边左侧坐标值
    $up_left = $arr[$x - 1][$y + 1] ?? 0;

    //当前坐标右边坐标值
    $current_right = $arr[$x][$y - 1] ?? 0;
    //当前坐标左边坐标值
    $current_left = $arr[$x][$y + 1] ?? 0;

    //当前坐标正对上边坐标值
    $down = $arr[$x + 1][$y] ?? 0;
    //当前坐标正对上边右侧坐标值
    $down_right = $arr[$x + 1][$y - 1] ?? 0;
    //当前坐标正对上边左侧坐标值
    $down_left = $arr[$x + 1][$y + 1] ?? 0;

    return $sum = $up + $up_left + $up_right + $current_left + $current_right + $down + $down_left + $down_right;
}

/**
 * 新矩阵生成当前新坐标值
 * $current
 */
function newCurrentNum($current, $n)
{
    //这里可以优化成策略模式
    if ($current == '0' && $n == '3') {
        return 1;
    } elseif ($current == '0' && $n != '3') {
        return 0;
    } elseif ($current == '1' && $n == '2' || $n == '3') {
        return 1;
    } elseif ($current == '1' && $n != '2' || $n != '3') {
        return 0;
    } else {
        return '不在规则内';
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值