从起点找到路线并返回起点

时间:2018-01-08 01:19:09

标签: php algorithm data-structures logic

示例1

这是我们为PHP脚本(字符串)

提供的数据
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代码的上述问题,并提前致谢

1 个答案:

答案 0 :(得分:0)

这个问题可以通过图形逻辑轻松解决。通过查看示例,让我们很好地理解这个问题。

实施例: -

release

现在让我们分割(爆炸)每个字符串,因为它们是起点和终点,并用下划线分隔。

所以我们的顶点将是 - QA

从我的例子中可以看出,图表似乎是无向的。

现在,如果我们以图形的形式显示这个例子,如果看起来像这样: -

T1_P8,
T1_P2, 
T1_P3,
P8_P3

因此,从图中可以看出它是4条边: -

T1, P8, P2, P3

现在创建图形后,只需在每个节点上启动dfs并保留一个 T1 ---- P8 / \ | / \ | / \ | P2 P3 数组,以便跟踪您访问过的所有节点,这将阻止您再次循环那个节点。

现在我不会为你编写整个代码,我希望你能尝试,现在这个概念对你来说很清楚。

请在评论中告诉我,您的想法是什么。

希望这有帮助!