|

楼主 |
发表于 2006-12-22 10:47:09
|
显示全部楼层
来自: 中国山东青岛
按照编程的思想,14分钟 4 H; V6 W9 l2 K! e8 |# m+ E8 T
先让甲和乙过去,甲回去,丙和丁过去,乙回去,最后甲和乙过去。2+1+7+2+2=14分钟。
/ B& B& Y: h$ i! b3 g2 ]利用求图的最小生成树的算法,很容易解决! i( ~3 P8 r, E$ g" l
#include* `) y: S$ T, [; C5 {/ H. R5 g
#include2 o4 N* Q/ n# t, ^
. X$ V1 g" u6 i+ p
int a[4]={1,2,5,7}; //每人过河时间
' c/ y4 l" E, T6 Q7 {* Hint mark[4]; //0左1右
3 ?( y4 F+ t3 \' {5 Xint mark1[100]; //状态控制,只有2^4*2=32种状态
/ N# D& G. |2 Bint min;//最短时间
$ c0 ]. |; V7 r* @+ f( y
" \+ _7 \2 e* t! L% zint test(int light) //返回状态值
# R( {6 B% [6 h$ T5 B, E* f- O{$ Z0 D. c9 v% i7 Q& f; F( `5 U
int i,j;
9 k7 d7 ] o \( {4 nj=0;
& X6 E0 A% D/ Wfor(i=0;i<4;i++)4 c, K' B7 E8 G( L1 P* t
{
+ Y2 Z. H( A( _# w. aj*=2;2 m' i4 W, N" l7 y0 u. j" K/ O
j+=mark;4 B2 a' Q9 d9 {
}: I0 z+ H- e) b- w8 }
j*=2;
4 S/ g% ?" q- J/ M4 a1 G2 v# a* j" qj+=light;* r: u3 r, C, H, R) Y
return j;; o" o* A$ W/ @5 m | v. Q
}
4 ^; d. `' v4 t6 x. \
0 R+ m, l V o; @1 V" G5 B3 Sint search(int time,int light) //搜索% z. S& ?0 z8 @6 F8 b* E' n& a7 q$ f; o0 N
{* Q @" ?, x/ n x- b- g: D
int state;0 q* @$ Z$ @6 W0 y# |/ ?$ \9 ]! `4 ?1 X
int i,j,stime;
' L0 h" P# I5 u
# o) V# `( G, h1 [/ C/ t) {* O1 [state=test(light);
8 X D" S5 k) r' c9 e9 `if(state==31) //终态:人和手电都在右岸
. \ E- U- y+ m# F{
* _* S2 Y$ Y8 D, R% qif(time return 1;! N/ O# J- t. h
}
# u& L$ U* }* K/ A. {& p1 A$ B' ?% U6 v" w7 Y
if(mark1[state]==1) return 0;: y9 {7 D+ V% L) |, |: g
Q7 }/ U, u! P% Q6 @$ c0 Nmark1[state]=1;7 ]1 a8 j: w! X& H; B) ^( ~
; w; _# ?; M* M9 g1 pfor(i=0;i<4;i++) //1人8 Y ?0 ]0 [$ B
{. F$ D% o2 e/ F" n6 s6 u
if(mark==light)2 Q q; m0 M6 c/ x/ v. }3 U- T+ I
{$ u6 R, r( K+ r) r- c9 R6 j
mark=!mark; G. u0 {/ ^* T, S; \
stime=a;
; Q9 [6 C8 U4 I, tsearch(time+stime,!light);
; m/ t" C" U6 ?% j8 }5 m" e7 ~mark=!mark;
: i- u, F3 W. Q5 \$ q}% b( @) s. P$ J, U/ Q
}0 v* f: |) q' y1 ]. P+ [7 N
$ Y% \; }% I6 B2 V3 |1 c/ ]* k
for(i=0;i<4;i++) //2人
6 k# m9 L/ v; R* f' I{! b3 P. n: Z/ a6 h1 S
if(mark==light)8 H4 A; p: @2 O6 p: u- ^; Z! d
{
7 b$ s. o+ X6 n( B) P: e) rmark=!mark;. ^; G7 L4 c4 x' [8 }+ l
2 F5 j4 ]- Y; _8 e+ q+ G! ^for(j=i+1;j<4;j++) r4 h5 g/ D, G8 ?" m
{3 `8 X1 K4 l, k8 k
if(mark[j]==light)
* l5 B; w- f4 |; a( w{
2 ?: W/ K. c! M" t1 }mark[j]=!mark[j];
) s: x: S8 p6 E1 P& P- s0 P. Sstime=a[j]>a?a[j]:a;
' J( V _3 d) e" K
- m9 F/ r! u/ o4 }7 E# usearch(time+stime,!light);
. O1 [% ^, B4 g9 smark[j]=!mark[j]; f% F( x' B+ ]5 h; L% H2 s
}
" c0 Z1 z0 {9 x U3 z( b}( f) C4 @3 N3 N0 x6 l4 y3 ^) E
' k6 q) j# x8 e7 t9 vmark=!mark;
7 _" K+ x( F& L}5 V7 X, f. h$ Y% Z0 e/ R% V& g
}; [! ]& a% D: `0 p
* |! i6 ]% k" t' r% {
; \1 Q* | C: umark1[state]=0;0 ^% V: r# W' I" z& J1 q4 K
return 0;/ J5 @+ I- N- o1 W
}
3 N% d. c7 {! ~! w: T$ s* F7 @
0 R. |: M% H3 ?void main()/ l0 f+ R! {$ u( Q: O
{
% I; f$ Z9 M, B' C6 \1 p- X: `memset(mark,0,sizeof(mark));% n6 b( B' g2 U% B1 p( U
memset(mark1,0,sizeof(mark1));
# i0 P0 I# b) W9 h( x! |9 M
2 j% Q" z, T1 Hmin=100;# g' R9 o( q: O
6 H6 u ~5 g7 U5 x7 O% F6 `search(0,0);
! z7 z# {6 Q! k; ^8 @9 s9 Q9 L% i
+ }4 k2 k: a3 }( W7 kprintf("%d\n",min);
! s7 |+ ?7 ?2 U. H5 z$ H}
3 f2 g5 n H8 W* L9 [6 w+ |* W结果是14分钟。
$ Y" [) f3 b/ O0 @提供一个思路:让走的慢的两人同时过桥。 |
|