实现代码:
<?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] . ' ';
}
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] . ' ';
}
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 '不在规则内';
}
}