回 帖 发 新 帖 刷新版面

主题:[原创]公交车换乘算法[共同讨论和学习]

<?php
//[作者:龙龙,发表时间:2006-11-15,未经同意不得转载]
//本算法实现公交线路一次换乘,多次换乘算法这里不作讨论

//数据库名bus,建立数据表bus
//由于此换乘算法比较简单,只需一张表bus就可以了
//表bus结构如:
/**
 * **********************************************************************************************
 * id(自动编号 pk)    busline(公交线路 int 4)  busname(站点名称 varchar 20)  busorder(站点顺序 int 4)
 * 1                   1                        火车站                          1 
 * 2                   1                        胜利广场                        2 
 * 3                   1                        卖渔桥                          3
 * ...                 ...                      ...                            ...
 * 25                  2                        胜利广场                        1
 * 26                  2                        天香电器城                      2 
 * 27                  2                        五里墩                          3
 * ...                 ...                      ...                            ...
 * 数据库就是这样插记录的,可以把城市的公交线路数据全部插进去
 ************************************************************************************************
 */
//定义一个新类
//实现公交换乘
class buss{
    //定义数据库连接成员变量
    var $host; 
    var $user; 
    var $passwd; 
    var $database;
    var $conn; 
    //利用构造函数实现变量初始化,连接数据库
    function buss(){
        $this->host="localhost";
        $this->user="root";
        $this->passwd="";
        $this->database="bus";
        $this->conn=mysql_connect($this->host, $this->user,$this->passwd) or 
        die("Could not connect to $this->host"); 
        mysql_select_db($this->database,$this->conn) or 
        die("Could not switch to database $this->database"); 
    }
    
    //统计数据库中所有公交站点名,存入数组
    //返回站点名
    function busstotal(){
        $SQL = "select * from bus group by busname";
        $count = 0;
        $result = mysql_query($SQL);
        while($row = mysql_fetch_object($result)){
            $bustotal[$count]= $row->busname;
            $count++;
        }
        return $bustotal;
    }
    
    //统计数据库中所有公交路线,存入数组
    //返回公交线路
    function busslinetotal(){
        $SQL = "select * from bus group by busline";
        $count = 0;
        $result = mysql_query($SQL);
        while($row = mysql_fetch_object($result)){
            $buslinetotal[$count]= $row->busline;
            $count++;
        }
        return $buslinetotal;
    }
    
    //统计数据库中每一线路经过的站点,存入数组
    //需要参数line,区别每一路车
    //返回站点名
    function bussperline($line){
        $SQL = "select * from bus where busline = '$line'";
        $count = 0;
        $result = mysql_query($SQL);
        while($row = mysql_fetch_object($result)){
            $busperline[$count]= $row->busname;
            $count++;
        }
        return $busperline;
    }
    
    //统计经过某站点的所有公交车的组合
    //需要参数station,表示经过的站点
    //返回公交线路
    function passline($station){
        $SQL = "select * from bus where busname = '$station' group by busline";
        $count = 0;
        $result = mysql_query($SQL);
        while($row = mysql_fetch_object($result)){
            $passline[$count]= $row->busline;
            $count++;
        }
        return $passline;
    }
    
    //实现换乘算法的函数
    //需要提供参数,查询的起点和终点
    function bussStationToStation($start,$end){
        $flag1 = false;
        $flag2 = false;
        //函数回调
        $busstotal = $this->busstotal();
        $busslinetotal = $this->busslinetotal();
        //判断数据库中是否有此站点
        for($i=0;$i<count($busstotal);$i++){
            if($start==$busstotal[$i]) $flag1 = true;
            if($end==$busstotal[$i]) $flag2 = true;
            if($flag1 and $flag2) break;
        }
        //有一个站点不存在
        if(!($flag1 and $flag2)){
            if(!$flag1) die("$start站点不存在!");
            if(!$flag2) die("$end站点不存在!");
        }
        //两个站点都存在的情况
        //首先判断有无直达车
        $strTemp = "";
        //遍历所有车次
        for($i=0;$i<count($busslinetotal);$i++){
            $flag3 = 0;
            //函数回调
            $bussperline = $this->bussperline($busslinetotal[$i]);
            //遍历每一车次经过的站点
            for($j=0;$j<count($bussperline);$j++){
                if($start==$bussperline[$j]) $flag3 +=1;
                if($end==$bussperline[$j]) $flag3 +=1;
                if($flag3==2) break;
            }
            if($flag3==2)
            //保存直达车次,以||分割
            $strTemp = $strTemp.$busslinetotal[$i]."||";
        }
        if($strTemp==""){
            //没有直达车,则计算一次换乘情况
            echo("<strong><font color=#FF0000>".$start. "</font></strong> 到 <strong><font color=#FF0000>"
            .$end."</font></strong> 没有直达车!请参照下列换乘建议.
");
            //查询一级中转站
            //start起点
            //end终点
            //函数回调,取得经过起点和终点的所有组合
            $statpass = $this->passline($start);
            $endpass = $this->passline($end);
            //得到经过起点和终点的线路的全部组合
            $resultbus = "";
            for($a=0;$a<count($statpass);$a++){
                for($b=0;$b<count($endpass);$b++){
                    //判断两条线路有没有交叉点
                    $startper = $this->bussperline($statpass[$a]);
                    $endper = $this->bussperline($endpass[$b]);
                    for($c=0;$c<count($startper);$c++){
                        for($d=0;$d<count($endper);$d++){
                            if($startper[$c]==$endper[$d]){
                                //成功找到交叉点后
                                //存储交叉点处信息
                                //此只为一次换乘
                                $fistid = $statpass[$a];
                                $secondid = $endpass[$b];
                                $changestation = $startper[$c];
                                $resultbus .= $fistid.";".$secondid.";".$changestation."||"; 
                            }
                        }
                    }
                    
                }
            }
            if($resultbus=="")
            {
            //没有找到换乘线路
            echo("
抱歉,<strong><font color=#FF0000>" .$start. "</font></strong> 到 <strong><font color=#FF0000>"
            .$end. "</font></strong>没有直达车,换乘一次也无法到达!");
            }
            else{
                //找到换乘线路
                $resultbus = substr($resultbus,0,strlen($resultbus)-2);//去掉最右边的"||"
                $resultbus_ok1 = explode("||",$resultbus);//将字符串分割成数组
                echo ("<table width=600 border=0 bgcolor=#003399 cellpadding=3 cellspacing=1>");
                echo ("<tr bgcolor=#FDDD90>");
                echo ("<td width=150><strong>起点</strong></td>");
                echo ("<td width=70><strong>车次</strong></td>");
                echo ("<td width=160><strong>中转站</strong></td>");
                echo ("<td width=70><strong>车次</strong></td>");
                echo ("<td width=150><strong>终点</strong></td>");
                echo ("</tr>");
                for($mm=0;$mm<count($resultbus_ok1);$mm++){
                    $resultbus_ok2 = explode(";",$resultbus_ok1[$mm]);
                    //计算两辆车的起点和终点
                    $bus1 = $this->bussperline($resultbus_ok2[0]);
                    $bus2 = $this->bussperline($resultbus_ok2[1]);
                    //显示
                    echo ("<tr bgcolor=#E8F3FF onMouseOver = this.style.backgroundColor = '#FFF9EE' onMouseOut = this.style.backgroundColor = ''>");
                    echo ("<td width=150><strong><font color=#FF0000>" .$bus1[0]. "</strong></font></td>");
                    echo ("<td width=70><a href=''>" .$resultbus_ok2[0]. "</a></td>");
                    echo ("<td width=160><strong><font color=#FF0000>" .$resultbus_ok2[2]. "</strong></font> ==> </td>");
                    echo ("<td width=70><a href=''>" .$resultbus_ok2[1]. "</a></td>");
                    echo ("<td width=150><strong><font color=#FF0000>" .$bus2[count($bus2)-1]. "</strong></font></td>");
                    echo("</tr>");
                }
                echo("</table>");
            }
        }
        else{
            //有直达车,直接显示直达车情况
            echo ("<table width=600 border=0 bgcolor=#003399 cellpadding=3 cellspacing=1>");
            echo ("<tr bgcolor=#FDDD90>");
            echo ("<td width=150><strong>车次</strong></td>");
            echo ("<td width=70><strong>起点</strong></td>");
            echo ("<td width=160><strong>经过</strong></td>");
            echo ("<td width=70><strong>经过</strong></td>");
            echo ("<td width=150><strong>终点</strong></td>");
            echo ("<td width=150><strong>详情</strong></td>");
            echo ("</tr>");
            $strTemp = substr($strTemp,0,strlen($strTemp)-2);//去掉最右边的"||"
            $strTemp_ok1 = explode("||",$strTemp);//将字符串分割成数组
            for($nn=0;$nn<count($strTemp_ok1);$nn++){
                //计算车辆的起点和终点
                $bus = $this->bussperline($strTemp_ok1[$nn]);
                //显示
                echo ("<tr bgcolor=#E8F3FF onMouseOver = this.style.backgroundColor = '#FFF9EE' onMouseOut = this.style.backgroundColor = ''>");
                echo ("<td width=150><font color=#FF0000>" .$strTemp_ok1[$nn]. "</strong></font></td>");
                echo ("<td width=70><a href=''>" .$bus[0]. "</a></td>");
                echo ("<td width=160><strong><font color=#FF0000>" .$start. "</strong></font> ==> </td>");
                echo ("<td width=70><a href=''>" .$end. "</a></td>");
                echo ("<td width=150><font color=#FF0000>" .$bus[count($bus)-1]. "</strong></font></td>");
                echo ("<td width=70><a href=''>详情</a></td>");
                echo("</tr>");
            }
            echo("</table>");
        }
    }
}

/*
定义好抽象类后,使用就非常简单了
*/
$bus = new buss;
$bus->bussStationToStation("火车站","五里墩");
//一切ok,直接就可以看到结果了 
?>

回复列表 (共9个回复)

沙发

不错,,顶你一下。

板凳


直接查经过起点和终点的站。然后用数组。查出交集。交集就是要换的。更简单。速度更快

[em1]

3 楼

我是湖工的呀!
只要查出所有到过起点和所有过终点的路线
再看找出2者相交的站点!!
就OK!了呀!!

4 楼

有点长
没仔细看

5 楼


很不错吗。可以转载吗?有急用呢,我是初学者

6 楼

可以!

7 楼

呵呵!看了不错啊!长了见识

8 楼


  推荐给Web程序员
 
  [url=http://www.888RMB.com.cn] www.888RMB.COM.CN[/url] 为中国赚钱网站。 提供网络赚钱教程、络赚赚钱经验、络赚赚钱秘籍、络赚赚钱项目、络赚赚钱产品, 为想赚钱的人群提供一个赚钱的网络平台!

9 楼

好东西

我来回复

您尚未登录,请登录后再回复。点此登录或注册