第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!( S5 m) t3 l7 _( f4 d
4 ^( \" c- @% p* j; Y1 Y4 U9 e
( E8 f5 G6 Q% d' M编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)6 K% A# J' ?" k4 ~" \! `! {) F
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看 2 u) K$ _2 N6 `) W% ~ & v. A3 k: Z6 e! T4 R v* q, i+ I7 z- T: o
uint value1,value2; 3 ?, `) h& M) p( E+ O) ` uint a[200],a1[200];//定义一个数组 + E3 G# o7 T4 o9 Z2 R uint b[200],b1[200];2 ^: o: A0 G8 _* W3 M x
uint c[200]; $ e9 S. C* `+ G4 E4 V ' H# H0 r, w/ S( T5 A & v/ j5 T c/ c6 H, f! `& F2 F! Y! r" C0 d
void routes()2 s6 |1 ?3 N# W1 ] L3 P9 w" n
{/ _% f( N+ K* Y6 `! i; X
: ~3 i. ]' g# L, [, |2 \
uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0; : T% o9 b' u7 R# I uint linshi1,linshi2,e=0,f=0; $ b* a5 x8 y7 F/ h6 u uint q1,q2,q3,t;% s7 |8 H1 P. u5 v& f
uint luxian1=0; ) l$ V$ Z6 L% t! |* |# \* P uint m=0; g" A! { V* J8 c1 U uint n=0;9 O7 p5 U- U8 J2 h, H8 _
for(i=0;i<520;i++)0 X; _' J3 T' u9 N, d8 u
{( o, ^+ j# h2 E9 s1 ~: ~
for(j=0;j<200;j++) N% I" J* O" O$ `+ O# ?' b4 W
{ ; _/ [2 \& l( V, C if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a ; @5 T. @2 o: @5 p$ ~* B {$ ^' T# w) z2 o# k" [
a[m]=i;4 e1 J5 ]# P- ~4 ] w! {" i7 X$ E+ [
//a1[m]=j; : V! B, t) K X; U; P$ q m++; - `- h6 \( J2 J2 P: B } . E. |: `7 ]8 k3 }# k if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b# {. P% X, b( X& S# r2 @
{/ j9 t. R/ u% Z! y4 s; h
b[n]=i; 5 [9 J0 C! u9 i% z: @3 G( s //b1[n]=j; 6 i& R9 I) X7 a9 b& R6 W n++;3 t8 k" V' g! A2 z. x$ w8 d
} ( K' ]- S! J/ q) q } ) I$ L6 n; y8 a! ~7 n0 X }' E9 {8 t. D& g! Y! Z `
printf("所有经过起点的路线a为:"); 4 {3 D6 G+ K6 I7 O, w6 X+ J for(i=0;i<m;i++) 3 n2 u" V# \* ]) ` { 0 V: F: l% S7 z* a# a; F+ C8 E printf("%d ",a[i]); 9 s4 d& A# B! v) M }" f: I4 p, _2 E8 I6 u4 x
printf("\n");) h8 x: J# ]; \3 A! U
printf("所有经过终点的路线b为:");' i& }9 x$ z* V# ^; L; m% r8 j
for(i=0;i<n;i++) ! x1 I+ I j7 f6 ^# Y. K { + A* Q# N, {- j& f; ~! b2 } printf("%d ",b[i]); b, j0 T! V$ A. j9 S( e, J
}; n1 L9 `, N1 A4 o. `& E' g' J9 t
printf("\n"); ! d Z; J$ m; e1 N6 Q8 ^4 M. U- b S' L. y
. y$ D! i, S0 D
/ q o+ m) L# m' m
for(i=0;i<m;i++)//直达路线的寻找 8 V- ~8 b: v8 j" X {5 p$ r7 R& j9 J2 }- G' C
for(j=0;j<n;j++) : Q: l# \0 d- Z% y- a. P0 K# S6 g) y { $ b8 I, e# N9 p! K! E2 f8 O4 r8 ` if(a[i]==b[j]) $ D/ E3 T' Z7 S' @& L { 7 ]& l* E6 [8 i( x5 }7 V* e* D {; N c[k]=a[i];0 j7 \0 @3 d2 \. q* @' o- ~) O
k++; . o! i* w: b& _4 ?. R, p$ {
} ( T0 @% C5 i) K1 G0 ^' M5 d }; o f, k, U( R) `$ @, }5 o
}2 o5 w% F2 v; N& Q& {1 b
printf("您查询的站点的直达路线有:");9 D9 e+ |6 s) h( w# `) C
for(i=0;i<k;i++) 5 F- p4 F. b: x g! c { ; E+ s5 d8 V+ ~ if(c[i]!=0)( s; x7 q7 Q: f7 K% m1 H; ]
printf("%d ",c[i]); 7 z% H) F! S" L! y" ^+ j* U4 r8 R }8 |5 J f0 A5 e
printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找 ' n3 [" ^+ ?4 ^" P; \! `& Q3 |* f$ m5 v
5 p% d, |: m6 w6 W
if(k==0)9 W+ z. R) a$ `
{4 e' D/ ~9 k& A1 `2 \
for(c1=0;c1<m;c1++)//转乘一次路线的寻找& P, q2 Y N+ c0 L
{ @/ G; ?% R& J5 K6 m/ a8 P I7 U
for(j=0;j<200;j++)7 e1 m+ N4 |0 A6 n( q# g
{) W0 j- _1 n6 B, b, K# }2 \, v
linshi1=a[c1];8 z6 A+ [" G" V/ G
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 {4 I* `1 w+ g [' J7 g1 g) Z
for(c2=0;c2<n;c2++) . n ?9 m6 h+ s n {: `5 x* {; D3 E' m, r
for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 + {! r/ y7 C2 R { " g% s& u) \/ o linshi2=b[c2]; 9 R5 z& T3 L! ]- k k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 % c, T" V& W% B8 U8 b4 b7 { if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 " I7 p9 l9 _1 y8 b3 H( ^ { ( H5 f' @ h1 _8 f* K) k printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);& W% \9 f) I2 D, P h+ E& v
luxian1++; ' p+ X1 R! |( ?) j# K! ~/ | }' C3 V1 c! ^' E) ~$ @% Q
} % f# U8 _* W1 e+ t } 4 j* N8 u% A# V# `8 G6 Z$ n* M } 7 ^8 _9 g+ t: U: i6 `; f# K
}) x& X& ?9 r n- X' l" }! w& K- ^
} ! P( X5 a' ?$ v$ ]; d1 l3 B+ O8 t# H; u. d- Z! g0 t7 j& x
; U; i0 O& r9 `3 {4 P
if(luxian1==0&&k==0) V) Q. k9 V: L2 C3 m* |
{ $ R) V# u+ ]3 Y4 J/ `/ d, G6 i for(c1=0;c1<m;c1++)//转乘两次路线的寻找 ; K$ E, {6 ? r2 D. s& b* \ { 4 c; y4 J( L* f& L8 c* k for(j=0;j<200;j++) . k. L0 N- X( J; B' _ { : N/ l: f6 e3 i" J8 N$ [ linshi1=a[c1]; ( u* J u5 i7 O# w0 B) ^/ f k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。$ J" U2 }. C* f7 c, c/ i
for(c2=0;c2<n;c2++)% s l$ p0 e4 Z3 T) L
{ , P2 ^/ z' ~8 \5 r7 x+ G for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 ) g* c; \- E: x a3 V2 e { $ N* k& m! m! A J1 X0 v linshi2=b[c2]; : P0 |6 f. m4 E/ V* h/ Y k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 " a% q" S4 A- i& O& n# ], J for(i=0;i<520;i++)& e( P E( v! [; s
{1 { t1 O6 H8 c0 Y, {
for(j=0;j<200;j++) $ ~# D8 @- z q) A T: z { ( L8 X6 h% ]7 z if(k1==y[i][j]&&k1!=0)- Z9 {3 c7 C( g; ~- \; C
{9 n, u1 t/ j7 L& T% j. t# U. y9 B5 X" o
f=i; . a3 D7 r/ k' o0 [5 W4 g5 w e=j; ( e: S/ R6 Z6 ]5 } for(j=0;j<200;j++) , H. ~4 h- T9 ^1 Q: w4 N; ` { 6 x: @, ~# ~' p* K% n, h( J if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0))! j! n0 }" C! ]( o$ N- f8 `# M
{ T# n m- n% y
printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2); 4 P" z0 r3 e% H6 w* o2 z# n2 s //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数; b8 O {& u0 {$ B& v
//q2=abs(j-e);% P/ [0 l& ~- X9 I
//q3=abs(b1[c2]-j);1 i- K4 ^* u9 T# y4 C) U
//t=3*(q1+q2+q3)+10;$ }& K$ E- m! I- L1 ], `' @" t
//printf("该路线总共计时为:%d 分钟\n",t); ; y! A7 [7 J6 x; ]+ F }5 l# D0 ~* u8 N C
} 0 n8 ^2 \0 r6 L! o( o1 C" U4 q }& K0 v3 o1 j5 ?
}% |# _9 v2 P' x8 E4 h9 C9 L: A
} ( y6 |; O8 A$ Y. b& D; j' G. N% T
} , \ d) P" n' P' r! o D } ( t, N! D) ~% x4 G4 s. E }( {+ Y/ ~8 b8 I$ t) G
+ o: W. e, g* v |
}0 p5 F( q4 u# R9 ~! {
} 7 A* C! v+ j7 T1 X. q7 l& a, ~ [: E T) e' M3 }3 R
* D. o' q- h% E' Q; J5 h+ g0 K
2 H9 I6 x0 v# a/ _. O- r( p3 q, P1 p3 S1 F* _0 R/ V1 Z1 z s
% x" D) j) l) ~; x $ d1 I |! `% g# S; S6 j) U 4 Z8 O' |7 U7 P3 v- d9 C( |9 n- o8 N" E- X* e$ X4 M. E! @
& l' u8 n% q" X4 @
! L0 [2 v. |! a1 y- M4 C5 Z0 b5 k) O
O+ C5 i& T$ \1 ]
3 V d( l; w) F9 w2 _
} ) w; P3 @3 y4 {: K3 ]( B0 S7 s- z; w' O8 }/ c* ~
void main() + k+ g. [. |3 c% e% ] l0 O { 1 q+ F6 ~' X5 Y printf("请输入起始站点和终止站点(中间空格间开): \n"); 1 k4 c8 {4 O0 J; D6 W6 z a" N scanf("%d %d",&value1,&value2); $ `# ~' Q/ R% o# [( G; s' Z" k7 M
routes();/ k" g2 N: p* p; S) ^5 G/ R2 Z9 H
$ m1 ~- W1 b3 @& }% _- X
} $ @9 C4 p* H1 A3 {