php 穷举 全排列算法 1-9数字,3*3正方形横,竖,斜相加值相等

<?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);
 
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值