第三天了,关于交通路线的选择,用C语言写成了个样子,下面代码可以正常运行,就是路线选择的结果不是很好,结果有好多重复的,有些站点似乎选不出来,这和存放交通路线的数组a有关,我们是把公交路线的上行和下行放在二维数组的同一行的,肯定有重复,但对程序算法也有质疑,实在是惭愧,自己不才,对其它语法实在是不太了解,用的都是for,if循环嵌套,还请仁兄指教。这是2007年的全国竞赛题,网上也有各种算法(基于不同语言),我们建模培训做真题,按自己想法用C编写了下面的程序,但结果不是很好,自己对其它的语句又不是很了解,实在没辙了,真心请教各位大侠,现在在改数组,打算将同一条交通路线的上行和下行放入数组的不同行里,真心寻求帮助,请求仁兄指导,谢谢!9 M6 u; t8 X+ V l% k8 Z
7 k! { |& J) A- }; F. S' i1 s& F5 u; v; P: W M6 |" _8 p% x
编写的C代码如下,由于数组a的数据带大,粘贴不过来(520条数据)' c- V' [5 \4 v/ `7 K
本人实在是很惭愧,对C其他语法语句不是很熟悉,用的全是for,if循环嵌套,还请仁兄耐心查看; K: d0 ?3 @! v
5 B$ v) i8 t: _; j+ J2 b- J7 [' t N9 U# y
uint value1,value2; 6 G( e# v8 A7 z" I6 `* A+ x uint a[200],a1[200];//定义一个数组5 J5 f, R+ z' h _, n+ D
uint b[200],b1[200];- I+ d. [: ^% R+ v! _" W& i3 ^. {' R
uint c[200]; * X7 g* _! |0 R. y/ L1 H) h- v6 b5 A6 Q. q1 {
% I: E! l L4 i3 X4 H' n1 s - q9 h9 t9 [0 J6 ~9 gvoid routes() . @2 O% n) k$ J' u1 \{ r7 v& O: j! R5 m; p 4 Z1 W4 q+ X; ~( | uint i,j,j1,j2,j3,j4,c1,c2,k=0,k1=0,k2=0; * g7 ^' h1 | x uint linshi1,linshi2,e=0,f=0; # I- X2 B' E2 S0 j uint q1,q2,q3,t; c$ v/ w+ e# T# B2 G* _ uint luxian1=0;: L' T9 y2 q$ I" B i- G
uint m=0; % m/ x' L$ }/ l# G$ a uint n=0;- `; `& T0 W" C/ B# q5 \$ U
for(i=0;i<520;i++)# U* L1 z1 F; {# I& H3 g- l* X# _
{7 R; h& S7 Q; a: _7 _3 S% `" c# l
for(j=0;j<200;j++)7 I2 I; g3 Z R+ v
{ $ |% w' i/ D) F; z if(y[i][j]==value1)//寻找包含起点的所有路线,将路线值放入数组a. j5 `4 Z3 C$ F' \
{ ( h" H0 K# [8 X0 B5 H: o. [: p( p/ E& Y a[m]=i; ; V. d4 ^& v3 L6 C* E+ o) \& \ //a1[m]=j;7 v& Q) U0 }4 {* k( q# z! v
m++; : x2 q$ O3 @) X4 H) t } 2 \5 p( v/ v; `! K* i v: z# x if(y[i][j]==value2)//寻找包含终点的所有路线,将其放入数组b' o6 w4 v% E' _0 R$ s* k
{( X6 J9 Q) F8 V) d3 B7 u4 y
b[n]=i;- C( B0 b) O/ N, L, n* O6 ^
//b1[n]=j;1 K1 }) w5 P! w% ]4 v0 K
n++; 6 r0 R; P+ k; K" d. r4 z }& n5 g* C0 B3 [, z& s& s# J
} . B9 u! ~ v, X; R2 P) b% M& R
}' \- \' }5 b% Q( Z6 a/ H
printf("所有经过起点的路线a为:");) b7 i' y' F- |9 R
for(i=0;i<m;i++)/ n1 a( i0 Y4 W% N/ g) A. F8 E
{ * x X4 D0 o% X+ ]$ V5 a printf("%d ",a[i]); ; B' g. s. o2 {5 i } ! H+ f0 l# j: O9 o% X printf("\n"); ! H/ r( A& Q& a3 j printf("所有经过终点的路线b为:");/ U4 S5 ^6 j9 S5 g
for(i=0;i<n;i++)! c' z3 l/ L- n" A3 ~$ V5 j
{6 q# v; T6 H7 Q) G1 w
printf("%d ",b[i]); 1 W# g8 m4 m' ~& Y" W, ^( B' u3 f }# Z$ V7 a1 R1 J: H% q' a, z
printf("\n");8 G7 A) Y& O8 A3 @( ~6 j3 b1 }! M
; o3 B P" J$ z5 g1 | , L8 ]5 ]* `4 V6 ~2 c1 F; W7 |; S4 j, D6 q% F" n$ @8 U M
for(i=0;i<m;i++)//直达路线的寻找* f, `6 S6 o- J* `" `
{1 O+ y K' ?5 S/ V% c+ t H
for(j=0;j<n;j++) 9 d4 u3 d5 b9 T/ c* x { 3 V3 ], h0 t; M1 K$ d" L& o) A if(a[i]==b[j]); N" j' m+ W2 `! M
{ - c2 q+ c# I4 z0 n c[k]=a[i]; . ]3 M `& }! R- I7 W k++; + {5 l5 L' M( a0 ~& d0 j9 r
} 6 N" s$ q, f9 S& D* k) r7 J } . L9 i; o! ~8 A/ w+ \# C! X } 2 I' Q- R8 J; E J4 i) S; T printf("您查询的站点的直达路线有:");7 _9 P' Y3 g. |* q8 B
for(i=0;i<k;i++) ' F W X W% Z3 _ { & X5 j/ g" J' V6 [2 N+ T+ z if(c[i]!=0)7 T7 Z6 H* ~, K% k2 }( D/ D
printf("%d ",c[i]); ) z) n3 y. z; ]( o1 t! i: S' Z# ~ } * E& v4 u8 r; l$ D; N" S printf("\n");//若没有直达路线这数组c为零,接着下面转乘一次路线的寻找4 [9 `' H' q5 s
* @7 y/ i6 R5 Y 0 b3 \3 J* ]+ G6 s. o if(k==0) S; |, R! M, Y5 E Y' v
{+ n) \ P5 Q$ b6 S6 O
for(c1=0;c1<m;c1++)//转乘一次路线的寻找 1 d2 }5 `/ [, K0 r b& R { 1 V% k* F9 r$ R" e) E for(j=0;j<200;j++)+ P, c! S5 C+ t% Y
{7 s* @ Y3 y+ y
linshi1=a[c1]; ' n- z2 u I( q6 S2 a* r7 a k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 + L! L' q8 K& T for(c2=0;c2<n;c2++); ?4 n" ^: s& l9 u( P/ ]
{ : e9 w' {( O/ X+ X) X% a) a( d for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。% r+ E: z, j' |1 `
{ , c. w8 }- ^& C5 X2 t( O- n linshi2=b[c2]; 9 n8 P# ~. s' T: ?$ u: q6 |# Y Y k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 ) B, K% J- j: R6 b/ }, y if(k1==k2/*||k1==k2+1||k1==k2-1*/&&(k1!=0)&&(linshi1!=0)&&(linshi2!=0))//寻找数组a,b中的站点,有相同的及为转乘一次的转乘点,并输出。 5 i- y* @5 D1 D; |2 R {$ O% \2 e% ~1 R+ }" Y x
printf("您可以转乘一次,起始路线为:%d ,中间转站点为:%d ,%d终点路线为:%d\n",linshi1,k1,k2,linshi2);1 X* U$ t/ {# E% u- E
luxian1++; 3 j2 C6 j+ S9 {3 o0 P } " K. f2 b/ z. J! f8 L* _. \0 B } 9 [ p% v% C% Z& }3 y$ m$ H } 9 L5 q. h" N* l6 N% B! \# Z } . v6 ]2 x" F8 A+ R } + r' F+ H N" G, }+ v5 z1 k3 ] } * f8 g) W$ T I , u# M& w6 J! u% ~6 S$ o$ ]1 t$ o8 n X1 N: j3 \
if(luxian1==0&&k==0) ( S: v. c9 R8 ^! R" B; @ { - ]# H* L8 i! x& O for(c1=0;c1<m;c1++)//转乘两次路线的寻找" g, h( i# |5 d( {0 O1 \7 T
{ ( N) a n1 Y" k, H& ] for(j=0;j<200;j++)- \3 l2 \8 i( y; E0 Z: y* V$ I: J2 I
{0 d/ k- j2 R0 y3 x# ?
linshi1=a[c1];9 a5 ?9 x! ~& K' I# h6 R: v( r& p
k1=y[linshi1][j];//取出a中每一条路线上每一个站点,接着与b中站点进行比较,查询公共点。 2 B) f9 A. L5 J, d for(c2=0;c2<n;c2++) & K" v/ w8 V4 J { 2 }% A4 ^' P4 z4 q for(j=0;j<200;j++)//该算法不是很好,j小于200时还得往后遍历。 # r/ X! U$ J6 A! Y9 v) O {# s* [" i. s9 M" B& {, E/ \4 N1 y
linshi2=b[c2]; . T$ l4 D4 G# D7 P& j k2=y[linshi2][j];//将b中的站点取出与k1进行比较判断。 1 Q) G/ E: U$ ]5 ? for(i=0;i<520;i++)% W3 ]+ g4 v9 Q: l: [
{0 t: N& L1 I7 D- B# y* ^$ `
for(j=0;j<200;j++) ' ~9 o) k* l. J: \9 x! d { # J t- d2 \3 q7 O if(k1==y[i][j]&&k1!=0) # I* n3 z" T, A3 b/ J- H/ c; v { 6 M2 c, B) }; R8 W& w3 C1 N f=i; U. Z% N" R$ v/ ?& J4 j9 E8 h
e=j; # r) e; k. Y2 k" z7 ]' S4 J8 j
for(j=0;j<200;j++) R1 T1 W7 _/ @1 d
{ 3 S: s7 ~2 U" A( t) E" H# z1 { if(k2==y[i][j]&&k2!=0&&(e<j)&&(linshi1!=0)&&(linshi2!=0)), D, ^+ k4 U3 Y% j; s; E% M
{ 1 R6 I5 Q: T& U4 t" e' p& @( C printf("您需转乘两次,起始路线为:%d ,第一个转车站点为:%d,中间路线为:%d,第二个转车站点为:%d,终点路线为:%d\n",linshi1,y[i][e],f,y[i][j],linshi2); Q( K, f$ s6 R; I8 y' c //q1=abs(e-a1[c1]);//计算每条路线上经过的站点数 , w- ]6 x q; R# z8 F# F" z$ ~5 R //q2=abs(j-e); + x# ]; ^0 r7 d9 K& w //q3=abs(b1[c2]-j);/ f/ C3 ~6 _" {! G" H" ?
//t=3*(q1+q2+q3)+10; ; e$ H3 x7 v% @1 C7 I //printf("该路线总共计时为:%d 分钟\n",t);. F5 ~% H) J; a' d
} 0 s# Y, b1 v* G4 c f+ u }# {% V% N% y6 ]4 A
} ; f4 a) U5 M% i Z/ o } $ L) e& p y) H7 R3 Z$ Y& E4 Z$ f } 7 z' x9 [. F' `' V1 E6 A* v+ p3 v
} 6 e5 [0 W: o' p
} 9 Q4 G c' U" G5 f- q1 l } 7 z" Z/ @1 C J+ A: J9 b7 C3 Z( T) T4 o+ r' L
}$ @/ Y! Q* o9 M8 g n$ }& {
} a5 v8 O: p' I! J# e
- u/ X1 f. Q. o: w" j, e
) A V( L Z' G 2 k) e9 m" ^" f! X* ]' D" o" x$ a. I5 t6 k3 `
' ]4 n$ }7 Z4 X v2 h; c' x
" q& F& @% ^1 n7 j% g, e& q% U) r" {
% s& @5 ]5 K- k/ h. g) s W+ m) @0 S
) k+ c: H& u" M; `$ c8 m; j' o' G2 a) z# M4 Y( Z; q1 h
& S; I! m+ \0 ^* \
$ U& m$ N' w- \! E/ K# W& u} 8 f- }" e+ Z I$ k3 F4 K8 l0 U% r0 @" _; Q, x6 i# K g
void main()0 J6 }' i. `% F8 b+ {
{ 0 W7 O2 A8 |) L5 L4 G4 x. g# Y printf("请输入起始站点和终止站点(中间空格间开): \n");8 k5 [# l& x, d5 r
scanf("%d %d",&value1,&value2); 1 i( x! d X3 ]: c* ^1 O# S( y
routes();; f4 J$ M, G8 N$ b2 Y
5 G$ o8 f$ \- Q& n5 s/ E T9 l
}- I4 Z* T, X7 w- m3 l% h I; [