第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!- H! x5 a! J1 a' s8 @6 c6 v
! Y' `/ [) p; _( I n ~( b 3 @" ~9 e2 m0 E+ ]/ T3 ~编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据); B6 b& S, Z0 i* I0 S1 c. W3 S& l
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看. J& b: z* h! L" ~: ^
) I! E9 F# T1 K
; [1 Y; h) z7 u; } uint value1,value2;, S2 K1 i5 X: d" u0 N
uint a[200],a1[200];//定义一个数组 6 F3 p V7 F+ `. ~ uint b[200],b1[200]; 4 t' P" a7 Q5 A. s5 v uint c[200]; ) X% d0 s0 S' Q. v: I8 h4 A' l0 T4 B; _' D2 c
, Q$ f2 i& v# l; B
+ X G- G- z( Fvoid routes() : X0 v2 v7 ]7 X' k, E# U{3 `5 h, y, Y# \: f
, r. c9 s6 t( H: E4 C! I6 X* V% ~5 S uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0;* z/ L1 y0 w |
uint linshi1,linshi2,e=0,f=0;0 Y& H5 g. J- a; R
uint q1,q2,q3,t;0 X+ M7 Y+ q" _
uint luxian1=0; 1 o; M" Z% |5 G2 Y' i+ a uint m=0;- L) u% W! N3 k4 b, h5 g8 o# m& p% u
uint n=0;& C8 |$ y1 t& G( ?
for(i=0;i<520;i++)/ C5 n7 h5 L. X; x
{4 r3 \5 R: v. Y: k" s. d
for(j=0;j<200;j++)- W% F, C4 p) ~* [3 L
{ , }5 G# E; s+ z. T, C) s if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a: K2 _0 m i/ V8 }+ w
{ n( c9 @* e1 J. e* @! m. ~, U4 K a[m]=i;0 `6 g8 Z' x# H5 s( r
//a1[m]=j; # o: N$ V4 [/ ^ }3 q- S/ I- k m++; % H3 z6 P2 l" t% E: y/ J } # i e( e( @7 X6 E! M if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b7 Z! e# t: ~3 U- {; d d- M4 O9 l
{, _" }/ ^8 d$ `' U0 a0 Z1 P
b[n]=i; 8 V" Z8 y6 h! p# E. C, T //b1[n]=j; 6 L4 w4 _; V& R. W3 z9 h7 m# c n++; : y/ f# Q' ]1 N/ U# F# l8 | }/ t7 z0 q x6 b
} 8 g) z1 o0 C1 N% W" ^4 ` } : w; S; N9 Y4 ^) G printf("所有经过起点的路线a为:");% |. O- z' \9 R4 V4 y" z
for(i=0;i<m;i++) ; k. L- A$ T- t" V& }% ?0 T+ K { 4 Z2 s0 r' u' N5 A% r7 k6 E printf("%d ",a[i]); " [) t- r) K. L4 c1 K } ( N" b# R4 Q6 J: L7 ~: U printf("\n"); 7 b% u. t! v5 z printf("所有经过终点的路线b为:");0 A: D3 V) u3 ?
for(i=0;i<n;i++)8 b& g O* w ^9 G
{* o5 L. |$ q% ]
printf("%d ",b[i]); d: i$ [4 _% [ } 6 m$ N& q% M0 b printf("\n");4 n3 V, A7 x) `9 Z
8 r+ R, {- j3 _# ?0 w/ @ $ L$ { a, C5 F4 D5 X 5 g1 u6 l t9 ~, d3 M' G4 S2 B. T for(i=0;i<m;i++)//直达路线的寻找, J1 {" M6 U6 O1 j% x4 R
{ 4 i/ W8 G2 r9 _3 j1 O for(j=0;j<n;j++)* g. @# j. V8 F b5 K
{ ) R. g8 i; v2 I% E: V2 J if(a[i]==b[j]) / {/ g! |7 ?. e$ { { / R4 h( h, A& ~# j" v4 t c[k]=a[i]; " |8 [! ]. }) Z. D6 B* w3 L$ p k++; 8 o% [; m9 A/ z# Y) y7 {
}0 }) Q* j1 {# I
} * [( T" d" T5 R; ^ }4 r" P+ N9 {6 T3 ~6 G4 M- g
printf("您查询的站点的直达路线有:");( }' t! N9 P* X% `
for(i=0;i<k;i++)' b% e8 X' ^* K! y
{! m- X9 l' p! q
if(c[i]!=0)- c v2 ] d% z
printf("%d ",c[i]); . E5 ]0 }0 F! V. T0 |2 { } 9 }( h2 o* j" b* h$ c5 u printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找% I8 {4 U, Q) i- C+ C4 l
^, v4 P/ Y8 }2 h4 E4 ?5 _
+ s3 F+ }# ~0 B U- J
if(k==0)3 @5 h" `0 P* S+ K7 ?. U
{6 i3 L- c% b% I: p
for(c1=0;c1<m;c1++)//转乘一次路线的寻找 6 @% P- E# ~1 ^5 W6 i+ a7 R# A& F { ! G, d4 X, }% `7 |& W4 A for(j=0;j<200;j++) # A7 H+ N# N" d, [. d, }/ M7 j {/ ]& N f+ F, B, A: [/ q; A! \
linshi1=a[c1];; ?: a' n _2 F: p/ s# n
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。: b7 `4 E! j) u: r
for(c2=0;c2<n;c2++)0 q4 _- b7 t7 p# u
{4 t) `! g; p: I7 v( r
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。. ^! T! R% c1 E& a/ S, `/ m; Q
{ " Z+ K) M X, X1 E! k0 E' d linshi2=b[c2];7 g1 M% b9 [2 d0 w7 W0 D7 c2 v5 v
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。8 r6 H* x5 \, d
if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 $ n% W* m0 u# L$ O; m7 I& ` {" d# O1 x7 _: z% }: U, B9 w
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2); ) M' o/ [, Z5 J luxian1++;+ U. Q! X" `% b2 [6 {) w' A
}# I* _! z) ^4 c2 G+ P+ C
} 9 _% a" o+ d7 D: \
} r' U1 E& s0 j1 A0 }" w6 j
} 6 T# L) W' m$ m5 Y0 L( M. U
}4 i. i V8 w/ g3 ?. p% x" a
} % |4 K, I0 y; @* J ~& F+ W, q7 E% Y8 `& u3 D) x1 K$ n g, W8 j
if(luxian1==0&&k==0)! {8 n6 i" |+ A; k, E
{ 8 _5 z: P- X& M! x$ R+ h3 o# \3 U4 t for(c1=0;c1<m;c1++)//转乘两次路线的寻找 9 W8 j' X5 x6 F5 ^ { / B0 }9 y" [+ T$ l0 `, u for(j=0;j<200;j++) 4 F" B7 \5 I- i {& t- b$ @& d. M: z) }! P
linshi1=a[c1];7 n7 ~! D3 ~8 U: ^" a7 `4 m. ^, F
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 2 ?9 \% t2 n# h" G6 R for(c2=0;c2<n;c2++)" c J" \5 L4 d
{ 3 Y# M% m- Q% k9 e for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 3 R; s9 s: m0 z/ g; ?5 A; u { / j2 H- R8 W1 k- j4 _6 w" b2 o3 p$ a linshi2=b[c2];4 k+ a7 X' B2 s X# n- f4 n# d
k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。7 y% I: U) w" J1 _% ]0 d
for(i=0;i<520;i++) ( R$ h6 ^% S) v4 ^; a; W {/ `& Z& B5 e, i( l' E0 y
for(j=0;j<200;j++)0 W6 J& O. r/ f' F4 ]2 K
{ 4 S1 ~7 @! E0 j if(k1==y[i][j]&&k1!=0)* I0 y3 C5 ^, L* l
{ * G( ^+ m6 x S% O: O3 ` f=i;9 m) G7 q. \- l" K
e=j; % ]- r) ~6 V, m6 l7 t" s for(j=0;j<200;j++)- j: D8 `- F: f* u
{/ F) E: D. S. E. ?
if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0)) . O+ F0 k( v. h( F5 w9 T { t1 T" O+ S" P+ H
printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2); ) [$ y8 g+ y } //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数 ) S3 L9 Y# ~( x6 l# D //q2=abs(j-e); , S* b- X' Y$ K2 Z Y( l //q3=abs(b1[c2]-j);6 n* W" }- G0 C D0 P8 h
//t=3*(q1+q2+q3)+10; % n6 e$ u3 A7 O0 m; S | //printf("该路线总共计时为:%d 分钟\n",t);* W2 X' r! Y# G7 Q7 W
}! k) L3 t: o1 J6 o1 F
} & y( x6 j2 o8 S- ]& o# c5 r3 K } * [5 l2 m" W# G: l* r/ B } 2 t6 m- [$ @3 S) {- ^$ b( N } ' h3 S$ c% z8 |. Y } ! a5 r: i; e! _8 s2 M6 H( J } 9 G3 i4 t( x" m( u7 f6 w } # }) u. w% X, j/ z5 a6 ^" ^5 Z$ z. A" v7 G, X0 _: Q) k
} # J$ J S' y8 _$ [8 `. m3 `4 S& Y4 ] }8 {2 a0 P4 o' m4 V0 G/ r
1 [' T1 B) P, Y/ K, }$ r
% N8 r" L7 y% I+ Y/ Q6 I+ \3 N
) `/ ^+ [/ y* |6 p & U: y+ O& b i+ f/ ?8 L- z0 M4 y. u# j- ?# {& i
/ e5 t7 y2 O9 k e) H 2 a, Q( [# t0 y# f* h( _2 A: J, P
" |- d! L6 R$ w; g3 \: O
% c; `. U& @( M$ Q/ ] Q% U3 u! \
; j: l9 S5 ^3 G1 z j
+ Z, f& Q9 u/ l. {% T+ T1 a: i4 ]} " B3 a+ }; F! ^9 `3 J9 y6 L3 o4 ^. {2 _3 j- G! [+ N
void main() ; L. D6 W! H, t {3 f8 y0 l+ ~( q0 M7 R3 V4 C
printf("请输入起始站点和终止站点(中间空格间开): \n"); . @' t7 b# |9 b! U( v. P: g scanf("%d %d",&value1,&value2); + {/ l% `' g9 B) F+ d( z( _ routes(); 4 C: S0 {5 ~3 J3 w! W- ]( w+ V( J+ j
} # ?) X& L; D f8 [1 }3 W1 t