第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!; o' T( v, L. L8 ]
% _2 N: ^. I2 Q
t" Z0 o, _! ]. b. a; A4 b
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据) z- T- J$ }/ F: l" u
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看; m8 k7 {/ B8 N$ y+ \$ ?
; i* }1 v* D- M0 {2 t' k/ D" ~2 [
5 C5 p0 {/ `* w uint value1,value2; ( |+ J% a, g. s1 P5 v uint a[200],a1[200];//定义一个数组6 T. l! g. T5 `0 _1 c
uint b[200],b1[200]; 5 G# K0 W" R* m uint c[200];1 c* P! C! p9 y7 g: q, b; _5 e
) x# A* N) G5 X; k9 n/ O8 K, {! ? ]( U8 j; x2 G$ n/ R4 \% r6 b9 B! [" ]7 y- ~
void routes()% }+ C2 v C/ v( ^1 h; O
{ ) o7 t0 l G! i( k9 ?) b , n; G1 W; E. I8 F
uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;$ C6 C, ]2 c/ {; D0 d# R* K7 G7 P
uint linshi1,linshi2,e=0,f=0;& C" S% d! b( p( e0 Q( t
uint q1,q2,q3,t; 4 Q6 r( L# M. K) } uint luxian1=0; - I, D4 b( J3 n/ }2 z uint m=0;3 t/ k6 N% V% E3 |9 h0 _
uint n=0; ! C) j2 \5 @) a! x, @) P1 F for(i=0;i<520;i++) , ~6 e1 ^5 x5 R y+ x* P* Q& S { . ^$ m7 ]7 _" Q* t$ N# x for(j=0;j<200;j++)( a. e; O9 b; S* P! N
{6 Y7 @+ Y+ t5 i5 j/ q+ C
if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a 2 c. w' b( c `9 ^, u {) C+ j! D; ]. w' l. e, f$ Y! x
a[m]=i; 1 {6 [+ M- W8 L, X- X4 t //a1[m]=j;+ \- J4 z0 x: T+ }
m++;) o$ A/ \! w; ~! q5 K0 u# i
} 0 U7 @/ K, m" S if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b, _5 M) L8 V$ O7 R
{ + j P0 J3 J3 d8 ^0 W6 t8 l; T. T# e b[n]=i; , s3 l- ?+ @6 v0 _% R$ r //b1[n]=j;. M; t. P5 O& b+ ?. @
n++; ! u# X3 J! h( }+ ] }! h3 q2 Q/ [9 q6 @
} 3 E8 R3 @ B/ Y( E s& w }3 i/ D* j- Y8 I- Z" ~
printf("所有经过起点的路线a为:");; A5 V0 a: \$ o) l8 m- N
for(i=0;i<m;i++) 5 ]- c! A" L6 T- O: A { 8 F& `" @+ I2 v! s- C4 G5 e printf("%d ",a[i]); ! F4 s# ^+ O6 o: P' e } ) C8 C/ f$ Z0 B9 Y% w% m! [! k printf("\n");( @4 ?( X U/ ?1 {5 |/ G6 T9 J
printf("所有经过终点的路线b为:"); * r# ?. x9 ^- w6 ?1 Y; \ for(i=0;i<n;i++) $ \1 c' Q; F4 X! G5 b: B {/ c: h- O) V5 U$ ^* }) K% S
printf("%d ",b[i]); 5 q! m, d6 V$ Z. \+ s }/ T2 ~6 M0 O3 |2 U/ Y6 J" y
printf("\n");4 |" h" H6 u* w+ S2 K
5 R8 s& o" Z% O1 Z. o( ]& e# \ , S1 f# B! k- \; j& w* ^1 K9 F. Y3 A1 b
for(i=0;i<m;i++)//直达路线的寻找 : g* ?2 w* g h" c; L7 [ { * J& ~$ E0 [' V3 R' }( A- j for(j=0;j<n;j++) / f. i/ j1 o/ a8 \! S {! C7 |% Y) l( o/ q [# Q
if(a[i]==b[j]) # @8 t5 w: m/ p" S) d {# J: S3 P/ T: C
c[k]=a[i];/ {& ]: j, s9 l. |
k++; / V; u0 U. H0 \9 L5 h }: F; y! C8 Y9 {* p* n7 d5 T, D- m
} : N R! i7 Y3 w } 2 f3 `4 v/ }# }- Z" o printf("您查询的站点的直达路线有:"); - o+ N7 Q7 w( L for(i=0;i<k;i++) ; i: F1 q& J0 i) M) G1 Z A* y0 F { 1 B3 ~0 _, ?9 W if(c[i]!=0) 5 R7 o& i7 S' c+ ^- X B printf("%d ",c[i]); 9 g5 J& j. A* G' ^0 ?' k } 5 h; b3 V- t1 k [( U printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找 ' ~$ W. {' c1 Z& A' T4 M + T( s% N6 b4 u; ?, a3 i5 D/ B8 r" x9 u5 Z" g v. \$ o
if(k==0)8 Z C! E" _" N& G' |
{ ' i% m- e, M4 x3 {' |4 H for(c1=0;c1<m;c1++)//转乘一次路线的寻找 3 P/ ~& Y8 C( I3 f) [+ q+ }- R { 5 F) |' f8 W! @7 h for(j=0;j<200;j++) / |5 C) l& }) S/ V- Z* w/ t% @: p { 3 [ @ e: p1 ~! U& P: y linshi1=a[c1]; * ?, d( F9 t7 ]6 p7 A k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。" B. s h- H* J5 Z6 u* C( J
for(c2=0;c2<n;c2++) & Q1 v: m4 b/ E0 B. a { ) @% }4 G9 |4 T* @9 `& ?' D for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。3 H" A) a1 e. @9 b- w% m& K. A
{ - Q, r+ V" j k9 b: T, [9 | linshi2=b[c2]; , q5 f- X7 J1 X7 J! N k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。/ I+ z, l! K% y2 @
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 5 I8 B, w6 h/ `$ z5 G% ^ {! I( Z& s: {& q. a+ m, p
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2); / F( p. P. u6 I3 |6 a, l' c luxian1++;0 L9 n1 G) r- J) j8 a
}; {1 u3 s$ M7 a$ \ A) W3 k8 X
} " Z' P! n, i& {9 T4 H
} / }; L. e( t; Y2 f8 S: Y
} % B5 H: x2 Y2 Q1 J }0 v( j$ z+ m+ v
} " I8 I( c" N! l; r i: l7 S4 U8 p7 A7 H2 m S7 I9 y2 @0 a" T7 A. o3 s$ q
if(luxian1==0&&k==0) 8 t; P$ D) f# y9 ?' z5 C' V1 h { : P. V; s; W. d& Q( i for(c1=0;c1<m;c1++)//转乘两次路线的寻找 % W1 I: P. I" ?) y& w( A0 {3 h {" F; o f4 q/ h4 I. m
for(j=0;j<200;j++)2 R/ o$ T( J. W2 U, c! H7 a
{$ A U& E/ p! c
linshi1=a[c1];- S; T& ~- Y C) l/ Y
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。9 J+ v" |2 }/ s) d
for(c2=0;c2<n;c2++)' a) `9 e# _# C1 `- y
{ 9 z+ _: {+ u: K5 s% U8 ? for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 9 o: _: C5 B; i% p% F% ~6 o2 w% s {& I) P3 W H& [+ x; Y) b) o
linshi2=b[c2]; , U! i5 f6 c6 {2 Z" O+ j) H& { k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。8 s/ @5 W0 p# K `8 a
for(i=0;i<520;i++)9 M! B7 M1 s; }% y* ~
{5 ?. m" @3 t. P# H
for(j=0;j<200;j++)/ V, z1 ^, E1 i8 X& O3 w L
{+ N+ ?1 \( U2 @6 N1 [
if(k1==y[i][j]&&k1!=0)! A( P4 K' e8 w" w) `
{. X6 O3 E n, `/ V7 p4 F$ W
f=i;# f, |! S/ K3 P
e=j; $ c- P2 R% z9 D2 A" p; W/ s for(j=0;j<200;j++)' i8 v0 J/ ?4 |) J6 a+ ?& x" ]
{3 l8 W a" R% e- v$ \4 d
if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))/ f( g# X$ g2 _2 W2 ~
{ 0 t6 G+ [1 D: u I printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);" P% i2 F0 V/ I
//q1=abs(e-a1[c1]);//计算每条路线上经过的站点数! U1 {: c; W! @
//q2=abs(j-e); * Y* Z, G k/ ? //q3=abs(b1[c2]-j);8 Q7 q0 T1 Y O Y% d
//t=3*(q1+q2+q3)+10; + k" v: f7 \3 [3 T6 B1 y) K+ O //printf("该路线总共计时为:%d 分钟\n",t);6 f- P! \& d" |" {# x& d
} H" G: }/ ?& a; M. g } H+ U2 L B. t. Q$ l
} 9 z* _" ~% a1 Z }' U0 c) @8 v( a4 `3 j
} ; \7 e w) i }0 Q& }7 l
} - v& p) z# X2 J+ c
}' L) D8 x( e0 y* h; D
}( P' [0 ^/ e1 V: J* y. t4 i
8 i) n l/ d q# p% F( a
}$ e5 @; O, _6 S/ t& c% k3 ~
} 3 p% x8 o4 H3 }+ v6 G: |* `% @ 2 ?4 _4 x. ]# G* |- ~# _1 G- I; v# H, }4 i8 l7 X& Z
/ B7 O% t+ Z! U# a7 K
- Z* \8 k0 s( n% ]( |$ o" T: f+ @