乘車線路查詢

2021-08-22 13:53:21 字數 3611 閱讀 7574

背景

有如下表示乘車線路和站點的資料,要求查詢出指定站點之間的所有乘車線路:

usetempdb

go

-- 模擬資料

setnocounton

ifobject_id

(n'tempdb..#tb')is

notnull

drop

table #tb

create

table #tb(

id int

identity

primary

key,

lineid int,

state

nvarchar

(10),

orderid int )

insert

#tb(

lineid,

state

, orderid)

select

1, n'

廣州東',

1union all

select

1, n'

體育中心',

2union all

select

1, n'

體育西',

3union all

select

1, n'

烈士陵園',

4union all

select

1, n'

公園前',

5union all

select

1, n'

西門口',

6union all

select

2, n'

火車站',

1union all

select

2, n'

紀念堂',

2union all

select

2, n'

公園前',

3union all

select

2, n'

中大',

4union all

select

2, n'

客村',

5union all

select

2, n'

琶洲',

6union all

select

2, n'

萬勝圍',

7union all

select

3, n'

廣州東',

1union all

select

3, n'

體育西',

2union all

select

3, n'

珠江新城',

3union all

select

3, n'

客村',

4union all

select

3, n'

市橋',

5union all

select

4, n'

萬勝圍',

1union all

select

4, n'

金洲',

2 create

index ix_lineid

on #tb(

lineid)

create

index ix_state

on #tb(

state)

create

index ix_orderid

on #tb(

orderid) go

處理方法:

之前也有發表過一些如何處理這個問題的方法,但效率不是太好。下面的這種方法加上了乘車方向的考慮:同一條線路上,只有兩個乘車方向,而且一旦方向了,就不會再反向乘車(因為是從這個方向來,再坐回去是不合理的);如果某個站點可以換到另一條線路,則換乘後的另一條線路也是兩個方向乘車。通過乘車方向的控制,減少了演算法要搜尋的路徑。

-- 乘車路線查詢

declare

@state_start nvarchar

(10),

@state_stop nvarchar

(10)

select

@state_start = n'

廣州東',

@state_stop = n'

中大'

-- 查詢

ifobject_id

(n'tempdb..#re')is

notnull

drop

table #re

create

table #re(

id int

identity

primary

key,

path

nvarchar

(max),

state_count int,

line_count int,

start_lineid int,

start_state nvarchar

(10),

current_lineid int,

current_state nvarchar

(10),

next_orderid int,

flag int,

lineids varchar

(max),

level

int )

create

index ix_current_lineid

on #re(

current_lineid)

create

index ix_current_state

on #re(

current_state )

create

index ix_next_orderid

on #re(

next_orderid )

create

index ix_current_level

on #re(

level)

declare

@level int,

@rows int

set@level = 0

-- 開始

insert

#re(

path,

state_count, line_count,

start_lineid, start_state,

current_lineid, current_state,

next_orderid, flag, lineids,

level)

select

path

=convert

(nvarchar

(max),

rtrim

(a.lineid)

+ n'',

line_count,

state_count

from

#re

where

flag = 0

乘車路線查詢

模擬資料 set nocount on if object id n tempdb.tb is not null drop table tb create table tb id int identity primary key,lineid int,state nvarchar 10 orderi...

地鐵線路查詢

由於自身技術限制,目前只寫出了對線路的查詢和查出同一線路的資訊,對於換乘問題還沒有解決,接下來就談談我的理解。listsubwayn dao.getsubwaybynumber number 1 if subwayn null else var item varstatus status 中的加紅字...

最優乘車 bfs

description h城是乙個旅遊勝地,每年都有成千上萬的人前來觀光。為方便遊客,巴士公司在各個旅遊景點及賓館,飯店等地都設定了巴士站並開通了一些單程巴上線路。每條單程巴士線路從某個巴士站出發,依次途經若干個巴士站,最終到達終點巴士站。一名旅客最近到h城旅遊,他很想去s公園遊玩,但如果從他所在的...