第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!3 d+ z0 Y. o, B" i3 K7 K1 V0 ~1 e, t
) l+ P" H' M7 g: }) d: ?% n" m 1 F* H# K" v; }; X' \; |编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)/ D( X. U4 A' k6 c: s
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看 ! a& ^ E* C3 y: _ 1 N( }* y! \9 W* I& Y) P' ?8 y$ N+ L p% E: [- j8 y. e$ R% y# k
uint value1,value2;3 f C. A. O% O3 P5 ]2 A% Y7 @
uint a[200],a1[200];//定义一个数组 3 \5 ?. }! S0 W0 e uint b[200],b1[200];2 h* M- z# J; H* v6 ~
uint c[200]; , u' d+ l; U# _/ h ; ^! }& E5 X4 w$ e : z2 a3 B7 s- H ( W" n% ]# T' G( [& _# i5 Yvoid routes()- ]" L0 d6 ]* X" {& a, X( U
{( [/ w% {- f& U
& H: q+ M" ?5 y) J5 j6 Z uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0; , ^6 [4 w6 j) j uint linshi1,linshi2,e=0,f=0; 1 p$ h$ B$ C: u3 r Z. { uint q1,q2,q3,t;. e' R/ H- \8 z8 J$ i
uint luxian1=0; ! v$ @ i0 L& @/ H" h uint m=0;1 m! ]& ~$ t: ?; d- P0 Y
uint n=0;! Y e. W+ F0 v" ]! h
for(i=0;i<520;i++)! m# X) P( Q6 P# _0 e& l& O
{; i$ ]6 B* L6 H A* m& e9 D& R6 z
for(j=0;j<200;j++)! _' }+ l$ L9 j+ w+ h- B* o/ f
{ 2 V) o2 n* \/ e ]: ]# J1 \9 y if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a! z' y$ g/ s( D( G$ y6 h% N. G$ q1 J
{ K" t' [$ M4 L! M2 y; M! b a[m]=i; . ?6 X2 @2 {; T/ {- X' n% M //a1[m]=j;- K4 _5 Y/ }7 O6 ~
m++;( u) S- b G6 f
}5 [4 I% p5 S( a3 H. I) z# h3 b
if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b ' t D8 j3 N2 j/ r3 Y/ {; l { , x4 J: T7 o5 ~! o+ A$ `* ` b[n]=i; " W$ Q& q/ N: O. c! N8 _ //b1[n]=j; 5 p( _& f4 P3 y# b- N5 e, p/ d n++;- s) k2 e' R7 X, l; G
} & N( ^* `& ^$ M/ X3 ] } ! a) ]) g y4 h$ P( }$ x9 ` }6 Y0 G4 s- t/ u6 x% t
printf("所有经过起点的路线a为:");6 s4 B) _5 y1 l
for(i=0;i<m;i++) # q% T* E5 h8 c: e Q { 7 }" c& N: D8 D; m printf("%d ",a[i]); " \6 V% Y, A' T g, a } L* A$ N2 ?( h+ E7 l7 j printf("\n"); 3 g0 Y2 n' ~2 v/ \0 z( ?& w printf("所有经过终点的路线b为:");2 Z, h6 i/ N9 ?% V' x* j" |) R: ~
for(i=0;i<n;i++) 8 [% [: t5 o! D2 N { 1 v* l' e: `3 F8 G9 d7 y* T printf("%d ",b[i]); % P5 K9 d t8 {9 @
}. K6 P. a6 Z2 L. H2 H( s5 j M1 a
printf("\n");9 f; u# o. T* ]" } S
8 Y2 X) `: X a
. z" G3 _/ X+ I6 G( h
! d; p+ ~( U) k
for(i=0;i<m;i++)//直达路线的寻找- O, h- O- Y _: a
{ 7 a! S3 l# b2 O) H for(j=0;j<n;j++)& X, b1 P6 C0 q& b3 |
{- P/ N% p8 Z/ h, l6 W% \! ~
if(a[i]==b[j]) 0 F4 Z P) v: w4 s4 v' O; {1 Y {; v; l. O# z j7 ]
c[k]=a[i];, I, Z0 `* i6 m0 ~ q
k++; ; C# q, W6 {: w; E. V
} / ^% d( X. o! M5 r, F }8 j# _, f5 v/ {& {
}% o; a+ q X% H q) {8 Q2 H
printf("您查询的站点的直达路线有:"); ! K& Y. ^* [- t. }% j for(i=0;i<k;i++)$ a) T/ `0 l/ X
{ 0 H l" ]( ^- s1 z if(c[i]!=0)" y) e# Z' ^$ I$ [ O' G3 L" ]1 K6 D
printf("%d ",c[i]); - y- f9 c2 F: T+ _; J& Z }, O. o( h& V7 b; P! u7 i. R6 g, _) H1 G
printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找/ [" B# w1 L. E! N9 Z5 S
q" A: e" g I4 u3 q1 t5 I0 S
& @% z& T, H6 U9 M9 i2 a3 e if(k==0) " P) b5 X% P# {# h {& Z3 f4 r+ i7 I9 ~; L% k
for(c1=0;c1<m;c1++)//转乘一次路线的寻找0 I% y$ s7 l+ g
{ 1 O3 r1 `4 t7 A: I) ^; L; K7 J! z- P for(j=0;j<200;j++) 8 I N" M; L6 {2 {: z' A { $ Z/ S6 M L+ S* o linshi1=a[c1]; 6 B+ l1 I5 G* V: s, \6 H k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。/ o6 c8 K/ L2 i& U$ F( v1 t
for(c2=0;c2<n;c2++)2 v/ `2 x8 `( ]
{ * A; J/ J- J& t9 p4 [9 @0 m for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。1 ~7 v# L% J w, W, U! x3 y
{ . m! ]$ K' B* r7 m5 D7 Q linshi2=b[c2];& N0 G! E5 p' e. v( m* x& i" c
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 L5 p8 W6 Q8 ?3 w
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。1 ?8 y) a* C! v3 k' w
{ 8 q4 X' }" o, | printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);. ~1 ^% x3 c5 s' Q( y( ^4 g
luxian1++;+ [ v3 d7 U2 z E3 l
} F0 E' S1 ~+ w, {5 S } - l" r4 v: ?( l. Q* K; @3 K
} & c4 ?; h+ x8 ]5 z } / w& j6 d/ t$ y: X& N }! L: G8 q; A+ U' s/ u! J
}% m. ]8 _" i0 s
) ~" `7 x. H% q( s( ~+ ~
e# `2 A0 S. }0 ` i- E if(luxian1==0&&k==0) 4 J0 b7 v$ G2 `" F3 h7 y4 `, A { . t' v2 r1 u% p# V/ J% E& m7 I" Y for(c1=0;c1<m;c1++)//转乘两次路线的寻找/ S% ?1 R& s# \- ~" Y
{% B' G/ v% a6 w! V5 \
for(j=0;j<200;j++)2 {2 ^( q! G; a1 Y- t! C$ D3 x
{ / e# { ~* q7 t) J! [ linshi1=a[c1];& D6 ^" H, k( a/ L; ^7 {% N7 {$ c
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 $ k% H; ~6 o4 f R$ p" R for(c2=0;c2<n;c2++) + G p) N3 Z8 G+ X* w+ Q) G C9 W {3 @8 e: y; p6 }: @; a" X# l
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。: S! X; u% S- |9 v! M7 w3 e
{0 R1 n0 ?7 n# X5 {1 Y
linshi2=b[c2]; , W E0 q0 c* F& X. b3 G/ Z, h1 G k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。1 ]5 ]/ r, u0 s! v
for(i=0;i<520;i++) ; J+ ~6 }) ^- C" ] { + M' R- \4 H' r9 x for(j=0;j<200;j++) , t2 Y/ U5 ~; A: o {9 ?/ X- K/ K1 T
if(k1==y[i][j]&&k1!=0) ( _. H/ v4 b6 P/ E7 V' J {' _8 o; V' I# e# ]) r9 ?- w4 g* j
f=i;7 J( I p. c, a8 s9 q5 d$ R3 O: R
e=j; i: R' N9 w2 M- |
for(j=0;j<200;j++) 2 Q' L. \ B2 J, f { * b" |# `5 Z2 I1 V, l4 T# }0 a5 n: V if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))9 x: W1 @1 @2 p4 M! O
{ & u* @+ V | @ printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2); 7 F! e! Y0 y1 t/ @ //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数* n# Y* l2 q X
//q2=abs(j-e);* z! m7 S6 J* S6 Q* G
//q3=abs(b1[c2]-j);9 V% T+ {! P' N n, k
//t=3*(q1+q2+q3)+10;& N$ l: G1 L! O R9 x; F1 u
//printf("该路线总共计时为:%d 分钟\n",t); 6 w2 d; c' Z- z- {5 Q% ~; l9 B/ ~3 | }# U* S& @$ e' t5 q, X1 u" E( }6 r8 \
} & B2 l J$ b$ _* n1 e' I }% o3 h6 i7 L6 e+ |* f
}9 w2 K8 B3 Q( r
} 1 w* }( d+ r' U6 L* a5 b/ I
} ' r6 s& V$ h; z$ ? Z6 W } # Z# c8 S; N; B @ } 4 U Q9 Z8 J) K0 ~' X! g4 m: X$ m1 a/ n) I
} 8 `; n& o6 x! B+ o2 [" i6 E4 f } 6 |$ U: a5 a. b; o6 N7 ~# E* h: u, F a- d, |* r
9 A+ }. Z& \4 K1 h2 J z- M
# Z: U* S; h8 y$ g) y$ x0 N: w4 W# B+ S' O- u* i
- U: K0 Q { I4 y. u0 e
' |, Q5 A- y5 `
4 k+ R6 S# Q | ( O% Y8 U6 f- c7 K7 V6 g X5 b7 H( ]: q! p( }) ]
7 f7 p3 A0 y- H' e
A2 z+ [. O' n9 G