求算法:用php实现如下要求:(其它语言也可如:C或C++但注释一定要详细)

<?php//已知条件arr1=array(2,3,4,5,6,7,8,9,10,11,12);arr2=array(2=>array(3,4,5),3=>array(6... <?php //已知条件arr1 = array(2,3,4,5,6,7,8,9,10,11,12);arr2 = array( 2=>array(3,4,5), 3=>array(6,7), 4=>array(7), 5=>array(8,7), 6=>array(9), 7=>array(10), 8=>array(7), 9=>array(12), 10=>array(12), 11=>array(12), );//根据已知条件生成如下数组arr3 = array( array(2,3,6,9,12), array(2,4,7,10,12), array(2,5,8,11,12), array(2,5,8,7,10,12), array(2,3,7,10,12), );
数组2确实是手误写错了,正确的是:arr2 = array(2=>array(3,4,5),3=>array(6,7),4=>array(7),5=>array(8),6=>array(9),7=>array(10),8=>array(7,11),9=>array(12),10=>array(12),11=>array(12),);图中现在能连出5条数组,所以需要生成5个数组,如果要是连出6个条线路,就要生成6个数组,依次类推线路是指2,3,6,9,12为一条,2,4,7,10,12为一条
如果数组2发生变化,还会可用
如数组2为arr2 = array(2=>array(3,4,5),3=>array(6,7,8),4=>array(7),5=>array(8),6=>array(9),7=>array(10),8=>array(7,11),9=>array(12),10=>array(12),11=>array(12),);
数组2中第三个数组多个8就是,节点3后现边个节点8,梅园寨主 的程序就报错了

由于不理解所以无法修改,请大家帮忙,谢谢
展开
 我来答
梅园寨主
2017-01-04 · 超过66用户采纳过TA的回答
知道小有建树答主
回答量:102
采纳率:88%
帮助的人:18.6万
展开全部
arr2 有问题,应该改为:
arr2 = array(
2=>array(3,4,5),
3=>array(6,7),
4=>array(7),
5=>array(8),
6=>array(9),
7=>array(10),
8=>array(7,11),
9=>array(12),
10=>array(12),
11=>array(12),
);
就对了,能跟那张图一致。

给你 html 吧,js 跟 php 语法差不多。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>数组</title>
<style type="text/css">
</style>
<script type="text/javascript" charset="utf-8">
var arr1 = [2,3,4,5,6,7,8,9,10,11,12];
var arr2 = [[0],[0],[3,4,5],[6,7],[7],[8],[9],[10],[7,11],[12],[12],[12]];
var arr3 = [[]];
var arrayCopy = function(aArrayA)
{
var aArrayB = [];
for(var i=0; i<aArrayA.length; i++)
aArrayB[i] = aArrayA[i];
return aArrayB;
}
var arrayAmplification = function(i, j)
{
for(var k=1; k<arr2[arr3[i][j]].length; k++)
{
arr3.splice(i, 0, arrayCopy(arr3[i]));
}
for(var k=0; k<arr2[arr3[i][j]].length; k++)
{
arr3[k + i][j + 1] = arr2[arr3[i][j]][k];
}
for(var k=0; k<arr3.length; k++)
if(arr2[arr3[k][arr3[k].length - 1]].length > 1)
arrayAmplification(k, arr3[k].length - 1);
}
var arrayExtend = function()
{
for(var i=0; i<arr3.length; i++)
{
if((arr3[i][arr3[i].length - 1]) == (arr1[arr1.length - 1]))
continue;
arr3[i].push(arr2[arr3[i][arr3[i].length - 1]][0]);
}
}
window.onload = function()
{
arr3[0][0] = arr1[0];
var iNum;
for(;;)
{
for(var j=0,k; j<arr3.length; j++)
{
k = arr3[j].length - 1;
if((arr2[arr3[j][k]]) && (arr2[arr3[j][k]].length > 1))
{
arrayAmplification(j, k);
}
}
arrayExtend();
iNum = 0;
for(var j=0,k; j<arr3.length; j++)
{
k = arr3[j].length - 1;
if(arr3[j][k] == arr1[arr1.length - 1])
iNum ++;
}
if(iNum == arr3.length)
break;
}
var sStr = '';
for(var i=0; i<arr3.length; i++)
{
sStr += arr3[i] + '\n';
}
alert(sStr);
};
</script>
</head>
<body>
</body>
</html>
追问
寨主你好,能否加上一下注释,说明一下解题思路,我跟不上你的思路,如:每个函数的用途判断的,如何判断出是5条线路的,谢谢
追答
注释发你私信了
怀老师小课堂
2017-01-04 · TA获得超过674个赞
知道小有建树答主
回答量:1017
采纳率:80%
帮助的人:261万
展开全部
2 3 4 5 6 7 8 9 10 11 12
2 3 5 6 7 7 8 7 9 10 7 12 12 12

0,x 1,x 2,x 3,x 4,x
2 3 6 9 12 2,4,7,10,12 2,5,8,11,12 2,5,8,7,10,12 2,3,7,10,12
判断经过4个数得出最优线程,其中3,4,5为一组,6,7,8为一组,9,10,11为一组,2为起点,12为终点

感觉这个算法是为了测试线程优化吧,线程达到一定程度会损耗系统运行速度,用php写的话可以试试用排序的算法,才疏学浅,只能把自己的思路写出来了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
骨灰级理科生
2017-01-04 · 超过22用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:42.1万
展开全部

首先, 看到图我感觉条件中是否是这样的 $arr2[5] => array(8), $arr2[8] => array(7, 11), 如果我的假设成立的话,代码如下:

<?php
$arr2 = array(
2=>array(3,4,5),
3=>array(6,7),
4=>array(7),
5=>array(8),
6=>array(9),
7=>array(10),
8=>array(7, 11),
9=>array(12),
10=>array(12),
11=>array(12),
);

// 首节点从 2 开始
for ($i=2; $i<=6; $i++) { 
for ($j=0; $j<count($arr2[$i]); $j++) { 
$k = $arr2[$i][$j]; // $k = 3, 4, 5
if ($k > 5) {
break;
} else {
if (is_array($arr2[$k])) {
for ($l=0; $l<count($arr2[$k]); $l++) { 
$m = $arr2[$k][$l]; // $m = 6, 7 || 7 || 8
if ($m > 8) {
break;
} else {
if (is_array($arr2[$m])) {
for ($n=0; $n<count($arr2[$m]); $n++) {
$h = $arr2[$m][$n]; // $h = 9, 10 || 10 || 7, 11
if ($h == 12) {
// 尾节点以 12 结束
break;
} else {
if (is_array($arr2[$h])) {
for ($b=0; $b<count($arr2[$h]); $b++) { 
$g = $arr2[$h][$b];
if ($g == 12) {
$arr3[] = array(2, $k, $m, $h, $g);
break;
} else {
$arr3[] = array(2, $k, $m, $h, $g, 12);
break;
}
}
}
}
}
}
}
}
}
}
}
}

var_dump($arr3);

但是,如果条件确实如你描述的那样没有错误的话,以上代码并不奏效。

但是你给的图,节点5只有一条路线, 节点8有两条,我就姑且先自己假设吧,希望有所帮助

追问
谢谢你的回答,不过可能我讲述问题不清楚,数组2里的数组,不是一成不变的,你的这个程序 只能真对现有的值进行,如果能像 楼上 "梅园寨主" 那样把程序写活了就能更好,可惜他用的JS写的没有注释,不能理解他的思路,你这个有注释,但程序写的不够活,能否参考梅园寨主的改善一下,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式