第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!% f* {; ? N+ x/ k' b/ [$ E
7 o- a) x! B6 z c b4 k1 Z8 y* L, X9 v- p! w) L
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据). l! d. }) F- _- G! w- w
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看 ' i) n& s" m( K" B0 T; ^" [" H " [+ W) e" j: d1 h1 h , L, j* K; O! _ [5 ^6 S1 w uint value1,value2;) n# l6 {, L3 Y) @. Q4 d' S) v
uint a[200],a1[200];//定义一个数组 : a1 H1 n' g5 q: `0 L uint b[200],b1[200]; . M6 I( v' h! U$ y" ^ uint c[200];2 g: N% f4 P0 j5 X; e1 C9 W/ G
$ N: E5 d0 C2 T$ M& K* v4 A/ ]: i$ m
% M2 m' N, y% o( y # T3 B& z2 h8 n9 w/ @void routes(). ~) ]2 `, U7 U8 Q" C
{ 3 Z! ?1 i; y/ b) p # ?6 L! Y, w/ A, f; ?4 J" | uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0; $ V# n( Z+ J2 m4 l9 b uint linshi1,linshi2,e=0,f=0;. v. o/ N; L1 T# G7 b9 a/ s6 C+ B
uint q1,q2,q3,t; * h$ R. c0 G( i2 [ uint luxian1=0;4 V. i% c# P0 ]; t) m3 E
uint m=0;, y5 K5 Z; ?) x, S
uint n=0; ) v; Q: ?2 y# v' ~* l B7 @/ \ for(i=0;i<520;i++)7 u" A, O) ]; y
{ 8 }$ F- V9 \0 u; ^: l2 K for(j=0;j<200;j++) 7 y3 R4 g6 m. V5 p; P i { 3 s" x' j& @# |2 Y6 h if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a8 V6 U% H. O C: a7 h) T
{ ' _+ S0 D8 s: [ g a[m]=i; T# T* q& }) n //a1[m]=j;+ O# d1 [" s4 C( w
m++;2 g- x. ~/ Z0 W% y; @
} 1 R2 Y, _& m% D( f/ d1 L. x if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b; V- l+ ~0 X. O( k) X5 |
{ 1 j% w! ~5 q5 _( _ b[n]=i; 9 O& F& w+ d7 A0 G( x1 N; L //b1[n]=j;+ W' I. L! `4 H( y& s, i" w
n++; ( N1 C8 z$ l2 d/ L! H+ @3 Q; n; z }& F! b1 }& {* c# C
} z4 q* i4 }& ^- e6 Z }8 A: |7 A" n p H
printf("所有经过起点的路线a为:"); 7 r, E( y8 [0 p; @5 k for(i=0;i<m;i++) ; ^# _$ }8 L0 L9 }3 h1 X! g2 A { - D1 `5 ?, E8 _5 e printf("%d ",a[i]); ; {( C. ^& T4 D/ u; F* }* T }/ L& y7 z3 c. q: t k
printf("\n");0 W+ t# g6 l/ t, Z
printf("所有经过终点的路线b为:"); 0 G# o( W- M/ s; U for(i=0;i<n;i++)) k D7 ?: \2 R+ m$ |
{ ! T! i0 {/ h e printf("%d ",b[i]); , a! r: j9 L! W/ ], w } + X( {- d( c3 ` z: ?* } printf("\n"); 6 [* H4 j0 Z0 M$ }5 D* P! l' n \. m- T- y$ R! o* a
$ J6 M% ]. E+ s
' [" F7 R. f6 [& {( N Y5 y* v
for(i=0;i<m;i++)//直达路线的寻找 2 u1 A/ G/ H h8 z* q& i2 U {5 F3 w/ q! o3 Y: c& B% `
for(j=0;j<n;j++)3 s6 |- L4 W- n9 P) }7 W, P5 w; s
{6 M6 s$ ?4 o- J6 e% v
if(a[i]==b[j]) ' }* v) q1 k/ g& S# P3 ]& K {6 T) v7 c8 X& I. S8 A) T2 U
c[k]=a[i]; 8 \' a$ X2 F; e& s k++; , U7 N% z$ ^5 C! @ } ) Q% }6 ?4 D r$ C! z } 2 o5 f3 D/ S1 O' H; K( S O }9 }6 @& x2 p" w6 S* ~
printf("您查询的站点的直达路线有:");$ N; ]. K9 P) `( U
for(i=0;i<k;i++)- s9 R' m) Y" o6 K$ N
{6 T& r# f, l! U7 w0 r9 M
if(c[i]!=0) ) S& O% _( g5 u3 f% _9 q printf("%d ",c[i]); - V8 a% H/ i. B0 u }9 L o7 `% L7 N% |8 s! `# L
printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找0 F1 H% k1 Q0 e% q! F4 S
F- P! m" M* B! W5 B9 P% Q8 A l: d% r* I3 C
if(k==0)5 K4 D) H- n6 N5 Z) _( J* C
{ " }7 I% H+ g5 x2 @8 U" z for(c1=0;c1<m;c1++)//转乘一次路线的寻找 % Z) h+ k: {3 d {. T. {6 }3 v1 |+ H4 ?
for(j=0;j<200;j++)8 u* `0 W1 j9 S3 u3 H! K
{; Q+ j" W* P( c; N2 C
linshi1=a[c1];. s4 P. N- K/ E2 t; C
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。) j' J+ |* m" n. j; Q- r9 U
for(c2=0;c2<n;c2++). v5 r @5 e9 @1 w
{ ' r' V! a" ]8 ^8 V+ v for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 : O9 a7 \" b. Q$ x { 9 S& B/ j# Q. d, _; n$ T linshi2=b[c2];2 W) L4 K0 s; X1 z6 g0 B% U
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 * m6 L5 V( Q5 r* d6 S/ |0 G9 b if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 0 D+ l9 t# W$ Z2 G* v. H; B { f/ P1 E0 r2 O
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2); 6 A8 X$ y1 m% J6 B/ [ luxian1++; + O4 B' }% Y4 k4 C- X4 } } ) `0 s6 f- \7 t5 c' ]) o/ U0 u; @ } - K: X3 l y5 g4 D: y# k/ q9 w2 Q
} 0 z5 [, k: \' Y% Z# Y+ J7 S* k
} 4 L8 q. ^, }0 Y* J0 U- F) q& f
} # b* P# A u; H' G: D2 q } 8 D" M. Y% Z. T* u( h3 b2 T a$ w
. g( p& H% D+ `% \9 M; k* q if(luxian1==0&&k==0)- v) D; ]' B4 N! K5 I5 q1 e9 n
{$ r. h `% Z3 N4 `
for(c1=0;c1<m;c1++)//转乘两次路线的寻找 & k; w4 b* P( w: t& a! E/ s { : B7 ^% F0 j) V9 b* o for(j=0;j<200;j++)( e# J# v4 V1 o
{ " o3 p: Q x, X2 T# p& I linshi1=a[c1];) y p+ B4 }' r' S3 Z+ N) V& H
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。( P/ Q6 Y0 R! Z
for(c2=0;c2<n;c2++) ' G5 B( G9 y: O/ S6 p3 Q3 F {+ W* H' F3 S9 H( c- v$ j
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。; T- T* ]# S! E S
{ ) u: |5 q& F! l/ D linshi2=b[c2]; 1 @0 S7 F0 l, M0 v' ^ k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 , |3 D7 a7 }( [& ?' {- I7 u for(i=0;i<520;i++)# k% ^# F8 y: b) Y- ^8 K- ^
{. w6 M$ [) `) w( R% E+ q S8 @
for(j=0;j<200;j++). j3 H& e5 _5 H) s: ^
{- T6 S( y! ~. D4 c* X5 Y% P7 N B
if(k1==y[i][j]&&k1!=0)% U# n+ J& W! z# B* l
{ + u7 [9 X( u6 i( W g9 L% ^' ] W f=i; + k- v9 _) M$ V' y" n e=j; - n; b- d8 V# \. r3 ?- b' `+ T
for(j=0;j<200;j++)4 `! n+ c( l# E7 I( P; K0 u
{ 1 C% O& H/ j+ f" O( i' z! e' O1 C* U6 F if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))- M; A: |8 @! Q4 K7 [* _
{ 4 M9 ?+ e. _, ?& X6 x# h0 z3 p# {) v printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2);8 ^! c( v6 V4 X2 {5 h
//q1=abs(e-a1[c1]);//计算每条路线上经过的站点数 " P5 S' i6 F+ x( |! j v- P //q2=abs(j-e);( B c2 ]; \2 [( s8 p
//q3=abs(b1[c2]-j); 6 B6 z0 n9 u! n. B //t=3*(q1+q2+q3)+10;1 A/ `. U9 ^3 \% G
//printf("该路线总共计时为:%d 分钟\n",t);& @0 ~( T, v" j; f; T6 D
} & d4 `$ ?2 p! X( R } ) F( N7 j! |$ v& u2 ? } + p/ j% R8 k, p& ]) k C/ N1 [ }! |3 R* N7 }; ]+ r" Y! h+ X
} ) A1 N/ d4 J9 B; D8 A) J: L
} 0 E0 r3 f' N% n |1 S } ) @8 e6 ?: M8 }: X }' x2 J1 L0 X( i& C/ k: l7 \& ?