示例1
T1_P8,
T1_P2,
T1_P3,
P8_P3,
此数据可以是数组:
$TUBEDATA=array("t1_p8","t1_p2","t1_p3","t8_p3");
现在,脚本必须从数据中提取所有内容并在屏幕上输出所有可能的组合。 组合规则是如果我们从T1开始,我们必须以T1结束,我们需要传递所有可用的组合。 上述数据的输出应为:
T1 -> P8 -> P3 -> T1
T1 -> P3 -> P8 -> T1
P8 -> T1 -> P3 -> P8
P8 -> P3 -> T1 -> P8
示例2
如果我们向TUBEDATA添加新值
T1_P8,
T1_P2,
T1_P3,
P8_P3,
P2_P3 <-new value
此数据可以是数组:
$TUBEDATA=array("t1_p8","t1_p2","t1_p3","t8_p3",“p2_p3“);
然后我们有更多组合,输出应该是:
T1 -> P8 -> P3 -> T1
T1 -> P3 -> P8 -> T1
P8 -> T1 -> P3 -> P8
P8 -> P3 -> T1 -> P8
T1 -> P2 -> P3 -> T1
T1 -> P2 -> P3 -> P8 -> T1
P2 ->T1 ->P8 ->P3 ->P2
P2 ->T1 ->P3 ->P2
P2 ->P3 ->P8 ->T1 ->P2
P2 ->P3 ->T1 ->P2
需要注意的是不要创建循环。 循环示例(无效组合):
T1 -> P8 -> P3 -> P8 -> P3 -> T1
如果我们有allredy P8
,我们就不会再去了。
$given_data = array("t1_p8", "t1_p2", "t1_p3", "p8_p3");
$array_index = 3;
$visited = array();
$current_index = 0;
$current_data = explode("_",$given_data[$array_index]);
$starting_point = $current_data[0];//t1
$search_point = $current_data[1];//p8
$generated_rout = $starting_point."->".$search_point;
$round = true;
$i = 0;
do {
if( $current_index == $i ){
$i++;
continue;
}
$pointing_data = explode("_",$given_data[$i]);
$t1 = $pointing_data[0];
$t2 = $pointing_data[1];
if( $search_point == $t1 ){
$current_index = $i;
$generated_rout .= "->".$t2;
if( $starting_point == $t2 ){
break;
}
$search_point = $t2;
$i = 0;
}
elseif( $search_point == $t2 ){
$current_index = $i;
$generated_rout .= "->".$t1;
if( $starting_point == $t1 ){
break;
}
$search_point = $t1;
$i = 0;
}
else{
$i++;
}
} while ( $i < 4 );
echo $generated_rout;
我的逻辑问题是我只能从一个方向找到路线,但是当我试图找到反之亦然的条件,比如交换$ starting_point&amp; $ search_point它没有产生正确的结果。
请帮我解决PHP代码的上述问题,并提前致谢
答案 0 :(得分:0)
这个问题可以通过图形逻辑轻松解决。通过查看示例,让我们很好地理解这个问题。
实施例: -
release
现在让我们分割(爆炸)每个字符串,因为它们是起点和终点,并用下划线分隔。
所以我们的顶点将是 - QA
从我的例子中可以看出,图表似乎是无向的。
现在,如果我们以图形的形式显示这个例子,如果看起来像这样: -
T1_P8,
T1_P2,
T1_P3,
P8_P3
因此,从图中可以看出它是4条边: -
T1, P8, P2, P3
现在创建图形后,只需在每个节点上启动dfs并保留一个 T1 ---- P8
/ \ |
/ \ |
/ \ |
P2 P3
数组,以便跟踪您访问过的所有节点,这将阻止您再次循环那个节点。
现在我不会为你编写整个代码,我希望你能尝试,现在这个概念对你来说很清楚。
请在评论中告诉我,您的想法是什么。
希望这有帮助!