第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!2 R& b- [. w& r6 h2 T
1 q0 q' i4 X6 d1 C7 H. Z" Q. ?) Z, S. ?: ^
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)3 v6 N, w1 }, v
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看/ o% o0 ?8 \6 G ~: `8 ]
$ V" Q" T3 a) e0 N+ l- i% e ! ]7 k R7 W! e8 k, z uint value1,value2; F& | n% }# _$ w. y; k
uint a[200],a1[200];//定义一个数组 0 I0 V. n$ K- Z5 l uint b[200],b1[200];- Y/ }" ]/ f d. Z( i/ Q6 `4 ^
uint c[200];. ^0 z1 o. H8 [! P2 a5 `. w: r) v
5 i4 X8 T% N, w; B- a% P: b+ h4 { B, A$ o1 a; k& b: R- d
; D _3 x q! S- r% f
void routes()/ J) x ^2 X6 ~1 E% z. C
{ 7 D0 e" ~6 f: p : S& \6 v- ?; Y9 E$ r6 A uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;; B4 c' _4 f7 [6 }4 ~: }3 J: a
uint linshi1,linshi2,e=0,f=0;2 B& f4 ?9 z# y8 U6 r
uint q1,q2,q3,t; 0 C7 y5 M: D( P& k+ t$ I) [6 f uint luxian1=0;* _% M7 l( h- q) D! K/ i7 ?
uint m=0; * K4 L: x# s3 B9 r% S( h; `% Z uint n=0; * ^1 r ^" e* {2 c& I/ o* _9 ? for(i=0;i<520;i++)$ x" i2 ^* i: t4 ?2 Y
{ & v5 {2 E3 s4 K2 U% b# ^' q for(j=0;j<200;j++)! `- c2 j% \2 r m& p X/ R) z
{ % G. r; D' T4 [) |, B if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a& z) s7 N$ X5 h Z, Q* ~& P" V
{* @; y' i6 t7 ]7 {9 o; e- s
a[m]=i; % J. R% q( Y6 ]& Y //a1[m]=j; 0 |5 r' y o. N0 [, m- e m++;' a ?1 ?6 P& z3 z
} , z8 u# D! X; X. c if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b" G- E& g" `" A
{ 2 s1 m% i9 G J5 k I b[n]=i; 8 D: r3 E- K6 J# l, J, V. I. e; L //b1[n]=j;: X2 a$ P# u2 N( e$ z2 K6 D
n++;( X, T3 c m! _# H$ r9 y0 R3 x
} _5 {+ {9 D" l
} 0 t, z* D8 ^6 k0 k2 K' T } : Y' O1 ?: u {/ Z printf("所有经过起点的路线a为:"); " f) O# f9 K% X0 |. {' K for(i=0;i<m;i++) $ w% d) h7 S+ T6 v- v { + c6 V' _0 M, p( j1 ^! J$ o printf("%d ",a[i]); 6 a/ a* R4 t, |: ?& b
} 3 q1 S/ K0 x8 F% X7 _' D printf("\n");! O2 @# u0 |, J
printf("所有经过终点的路线b为:");7 P6 J1 c$ n# K# X* ?
for(i=0;i<n;i++)$ U+ ~! u) v3 o
{ " q2 u6 I+ J* E# w1 N o+ Z( K printf("%d ",b[i]); ; F* D7 |! g: Z# E }- e" m; P4 o d0 z: B$ t
printf("\n"); 1 S8 i& t' R' B& g/ o7 q 0 }4 q8 I3 d& f0 A! ?8 w8 s! d" b
0 _( }; R5 d% h/ p. E# q$ c
for(i=0;i<m;i++)//直达路线的寻找 : Z: E) q0 e! | { ( O+ q( V) ~" D) Z4 ~ for(j=0;j<n;j++) 9 G. J$ V7 p5 J; P6 N! d& I { c1 f1 A/ y* x a, @
if(a[i]==b[j]) 1 O( b: _/ l* ~& m$ x: u) |; w0 A {. q/ n' M5 g/ X
c[k]=a[i];3 I9 A- ^4 t% @. b5 g
k++; 9 N; U4 x2 U: K& Z& T9 K } % E6 v: G6 y9 ?7 p }. C* Q% }0 C$ x" @8 u/ r
} + B4 o* I7 p7 N# ~0 _ {8 X5 f' v printf("您查询的站点的直达路线有:");% |/ {$ ^1 Y9 Y2 c
for(i=0;i<k;i++)$ M" H' w0 {; g+ H5 V+ G
{* c! X6 j5 n$ y% X
if(c[i]!=0) / `/ k8 S: v( U9 x% ?8 }7 G# m3 O printf("%d ",c[i]);( V9 w1 u3 {0 z2 M) U# m8 C" b
} ; ?+ ]! k9 o& y. H8 Z printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找 : L1 A; C h% J- t0 _- `" H r0 z+ @+ I# B: L 2 ~' ~: J: ^0 V" e1 ~) d7 t( | if(k==0) 5 ?; f- Z7 b- l* t( w Z {) e% @& y- e. O6 Q
for(c1=0;c1<m;c1++)//转乘一次路线的寻找+ H4 ~3 N6 ]& m' M6 D2 Z
{7 N2 A1 s7 r7 M5 E3 a$ i
for(j=0;j<200;j++): Z+ K9 m% }, l9 |$ A+ v# b
{2 J7 S* ?: l8 f8 {4 Z, {$ ^) j
linshi1=a[c1];4 X! V x( |: x `8 P5 X* e# z+ f
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 ! J+ w H0 L9 }8 G- [' m+ l for(c2=0;c2<n;c2++)# d; A& L F4 x2 ]" K* W
{ 8 Y1 Z1 E5 L- ^# \; c* u for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 & |5 A4 D z; x" X7 m# N {; J9 \+ }' }, U+ F$ Z3 h( \. @
linshi2=b[c2]; ) e' H1 O' d; T. x k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。4 E h0 A$ ]' b+ ~* u' m
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 * G0 h- E- G" P8 I0 P- g) z {. {3 X# z0 ? @/ J- t4 n; i/ E
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2); 1 Q0 `* n: M- T luxian1++;7 i' U7 I& @% m/ S! Y& {
} 9 @" Z. g m" X" I } 8 \+ @2 Y# ]8 y0 P/ O; \% R } 4 s- d" S5 u2 Z4 I7 E } 4 w& Q9 n/ C4 |- T } " q1 q/ s4 {1 a5 _ } x7 M! Y+ n; m 7 @8 O! o; \1 b. b' _" m8 P- }/ l8 @+ W6 Z5 K x0 o* n
if(luxian1==0&&k==0)" H a( F- Z: S1 j1 G! ~) X
{' w) v/ |+ M+ ?2 L0 Y/ _, b
for(c1=0;c1<m;c1++)//转乘两次路线的寻找2 H% E& K6 O: |8 H* X# F
{ : y& `$ x O8 u4 h5 o$ P for(j=0;j<200;j++)9 c0 Q5 p5 K8 s7 p% _* ~
{; H9 [, z2 s1 E' D' k% A' u' [
linshi1=a[c1]; 3 ^7 J# i7 H6 W: a. f9 y) ~# K: C k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。2 k$ s( N+ }/ D0 }% ?4 i
for(c2=0;c2<n;c2++) 7 }( E% E, D6 r3 e0 y& K {! }: K7 \$ R, W: _1 r
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 3 q: m5 ~/ h& A/ K. x" I {9 J# U% `; y- a" @0 d% J
linshi2=b[c2];2 H2 N/ P- t% a/ X5 o
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。' i4 n2 O; j' D2 v
for(i=0;i<520;i++)* [" u, r+ x* W4 }/ }" X
{ ; R: I7 K8 t) R, o. O; n for(j=0;j<200;j++) 7 Q6 Z- N4 ~; |/ ` { ; U D0 A/ ~' ~/ c' k% G! q" X if(k1==y[i][j]&&k1!=0)9 X& m- |- H! ^- b
{( B5 w# a8 G0 t- Q L s
f=i; ) Z0 |, B- i( L' i8 h e=j; 1 G6 r5 }3 J/ v! J/ ~ for(j=0;j<200;j++) & W; _6 e7 W0 j. r% k {8 u1 B9 @" ]3 c* P
if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0)) : h$ t1 {! G% i8 W {6 s6 r9 V7 ~* w
printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2); " W4 |3 z+ ]5 q //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数4 K8 `$ o/ t! |* t( Q
//q2=abs(j-e);% ^7 }* h5 C' I* l$ y) d" Z
//q3=abs(b1[c2]-j);* H/ d" j H! C$ Y9 v
//t=3*(q1+q2+q3)+10;5 K; q( }5 r; B) r9 g
//printf("该路线总共计时为:%d 分钟\n",t); - P1 `! D2 J) G9 k" {3 J2 ? }) I1 q+ o7 \! p1 w7 O
} 4 L# q% ]! G: J! R% @! L( ~ }" ?9 \, Q/ Y. g4 T) p: ]0 h
} ; Q# W* S6 h. ~; n6 u } @& }$ u* [) B4 Q1 a) v9 @
} : y) R% b) z4 q: p; z$ d3 [: u( p
} 8 P& ^9 h, l( ~& q } 5 w$ D/ u" e- }5 r. R: h9 c 3 ]5 G" R2 r, \3 W7 z! ?0 L8 @ }% Q; b. c7 Z/ B" Z( m+ V8 ~
} |; |% y. }; j' E. L: W) ^/ X8 }/ e% L5 P$ A! B% U) S7 _
/ y" {: k R" N