求算法:用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,梅园寨主 的程序就报错了
由于不理解所以无法修改,请大家帮忙,谢谢 展开
数组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,梅园寨主 的程序就报错了
由于不理解所以无法修改,请大家帮忙,谢谢 展开
3个回答
展开全部
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>
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条线路的,谢谢
追答
注释发你私信了
展开全部
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写的话可以试试用排序的算法,才疏学浅,只能把自己的思路写出来了
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写的话可以试试用排序的算法,才疏学浅,只能把自己的思路写出来了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先, 看到图我感觉条件中是否是这样的 $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写的没有注释,不能理解他的思路,你这个有注释,但程序写的不够活,能否参考梅园寨主的改善一下,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询