<?php
//实现全排列算法
header("content-type:text/html;charset=utf-8");
/**
* @param array $a 待排列的元素集合,会动态变化
* @param array $b 储存当前排列
* @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合
*/
function wholerange($a, $b, $M) {
if ($love == 30) {
exit;
}
$range = array();
if (count($a) > 1) {
$d = $b;
$aa = array();
foreach ($a as $key => $value) {
$b[] = $value;
$c = array_diff($M, $b);
if (count($c) > 0) {
$love++;
$range[] = wholerange($c, $b, $M);
}
$b = $d;
}
} elseif (count($a) == 1) {
foreach ($a as $value) {
$b[] = $value;
}
$onerange = "";
foreach ($b as $value) {
$onerange.=$value;
}
if ($onerange{4} == 5) {
$arr = str_to_arr($onerange);
$ok = test_num($arr);
if ($ok) {
print_r($arr);
}
}
}
return $range;
}
//将排列的算法生成2唯数组
function str_to_arr($value) {
$arr = array();
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 3; $j++) {
if ($i == 0) {
$arr[$i][$j] = $value{$j};
} elseif ($i == 1) {
$arr[$i][$j] = $value{$j + 3};
} elseif ($i == 2) {
$arr[$i][$j] = $value{6 + $j};
}
}
}
return $arr;
}
//$arr = array(
// array(
// 4,3,8
// ),
// array(
// 9,5,1
// ),
// array(
// 2,7,6
// ),
//);
//计算2唯数组 横,竖,斜是否都等于15
function test_num($arr) {
$line_45 = 0;
$line_135 = 0;
for ($i = 0; $i < 3; $i++) {
$line_45 += $arr[$i][$i];
//echo $arr[$i][$i]."\n";
$line_135 += $arr[$i][2 - $i];
//echo $arr[$i][2 - $i]."\n";
}
if ($line_45 != 15 || $line_135 != 15) {
return false;
}
for ($i = 0; $i < 3; $i++) {
$tal = 0;
$cal = 0;
for ($j = 0; $j < 3; $j++) {
$tal += $arr[$i][$j];
$cal += $arr[$j][$i];
}
if ($tal != 15 || $cal != 15) {
return false;
}
}
return true;
}
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
$b = array();
$range = wholerange($a, $b, $a);
?>
php 穷举 全排列算法 1-9数字,3*3正方形横,竖,斜相加值相等
最新推荐文章于 2023-02-04 16:49:16 发布