背景
有如下表示乘車線路和站點的資料,要求查詢出指定站點之間的所有乘車線路:
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公園遊玩,但如果從他所在的...