|

楼主 |
发表于 2006-12-22 10:47:09
|
显示全部楼层
来自: 中国山东青岛
按照编程的思想,14分钟
( c' N C2 x4 S2 ?5 T! c6 Z先让甲和乙过去,甲回去,丙和丁过去,乙回去,最后甲和乙过去。2+1+7+2+2=14分钟。8 f# L: L# I. n1 q- |
利用求图的最小生成树的算法,很容易解决
( J+ [" w3 P" R- a& {* I#include
6 a; N7 I1 b; G& ]3 b1 E#include
j/ w) k1 y; l; @+ U& k: r+ z
8 d: ]* ?# \/ X6 F8 ^2 r- {6 }int a[4]={1,2,5,7}; //每人过河时间
) L! g8 W/ x& u* L0 N; Z( Mint mark[4]; //0左1右
! f3 d1 v5 r! {4 _: _4 {int mark1[100]; //状态控制,只有2^4*2=32种状态
$ L) S. E& E% T* u( ?int min;//最短时间5 B! W/ V; L6 |5 A
5 d( t- ^7 B) l. f9 l6 Xint test(int light) //返回状态值
/ ~ ?: c- ~5 U' g& X2 n6 ^' Q4 ~/ I{
$ R# g# h8 p4 D7 b2 e- d! ?# {2 Mint i,j;3 S2 W7 _0 t7 M! T( q0 M
j=0;0 Q% z+ ^; X# Q5 x: ]
for(i=0;i<4;i++): v" b I5 ^5 h3 `$ X- T6 ?
{
# B) N$ f" s1 i3 h: P* a" Pj*=2;
5 P9 Y9 h% d* n" o# H& Z; Sj+=mark;" b- u. s: c6 K7 o1 ~
}5 `0 @2 C3 H% I) u$ s
j*=2;
. H' O' I, \( a) Ij+=light;
( \7 ]* E. G% l6 U/ b- Ireturn j;
! h- y/ r X3 R1 w& \3 X7 s5 t3 S# A}% A* T, d1 ]5 J" q# Z
; L2 H0 g0 h2 Gint search(int time,int light) //搜索* {1 ]4 |3 \. t0 p# w
{$ e, g% G8 o. n+ z- [" M& x) B: [
int state;) w" ]8 F, W3 ?/ i+ R
int i,j,stime;" o, h7 c: B+ s0 p. l! J
/ V( j* L9 v/ I# O
state=test(light);
5 L* C- R$ L9 _5 O+ n1 \8 T0 F/ A2 Iif(state==31) //终态:人和手电都在右岸: S) t% [* J$ ~. { ^8 n" n
{! p: N- b4 P9 J, X. r6 H( e5 r e
if(time return 1;
% z+ n; q- h9 _/ w}6 X, Z; }. E# r
. l0 R$ r X( `2 A9 I3 D
if(mark1[state]==1) return 0;
1 `3 Q$ Y) o1 v8 T0 |" O2 m3 M3 k+ O, b X/ w& j
mark1[state]=1;
, F: M8 Z/ N% O1 v" G) b! F: s0 j; d! A6 o, T* M3 F5 K. R8 z
for(i=0;i<4;i++) //1人
~8 \0 X T, ]; D4 G0 f) \{+ X: S7 K# U+ |( H5 N( Q
if(mark==light)
* m1 K' g8 B0 _" W4 V7 I{: k$ j3 e( g, F9 f
mark=!mark;: N7 ^- D# I' i; m! b- I4 \+ d6 ^
stime=a;
: e6 C0 k8 @7 ]& fsearch(time+stime,!light);
! N# L5 n6 q6 W' M8 S/ A8 a( nmark=!mark;
. D/ [& y6 O5 R! H) |9 m. s}
" D8 }$ C1 H9 o o}1 C. _& F/ N! M/ d# K1 e% C$ v( u5 t
5 L% P' u0 T' v! g" K% B* Y
for(i=0;i<4;i++) //2人
9 _& u4 Y2 n0 R# x* P5 f{
5 S% E- j7 v$ o/ ?0 D( m& Fif(mark==light)% A4 r" P3 v* Z1 J" H/ g( d
{
0 L8 K/ K x$ @* o7 R; n1 amark=!mark;
- t4 F1 M% |" x# T4 `0 ^+ y2 B' j; [% E3 k' m5 u* ^
for(j=i+1;j<4;j++)
" v8 l) O h# c4 }{
" n v E; ]: b3 L0 J6 Kif(mark[j]==light)
: j" |3 S; B/ V9 Z% E# w{/ C, } t$ w$ Q9 r
mark[j]=!mark[j];) o5 E4 w% ]) ]
stime=a[j]>a?a[j]:a;+ C' _. W5 k; u1 s( n8 ]+ f
+ K, c" k6 k8 K; A
search(time+stime,!light);
1 m6 P, K; y _9 W3 |mark[j]=!mark[j];
# T" E' }, v6 \1 M" g# f# s}0 [4 j. n4 }9 o+ i/ I. b9 B
}! M, U( L) b: H5 D. t3 I/ {
. L3 o- c: Z; z3 o7 ^" p' mmark=!mark;
6 a. e5 k+ ^2 d, K4 F$ R}0 r% q# u9 ^0 U8 @7 A+ m+ i: D k
}
9 G& z6 P% V6 M' Q' D* c! W/ v
% ^$ K& t3 ?" q5 n. b! W
7 _/ C1 Y: B1 I/ q( m$ N3 o7 _mark1[state]=0;
; R1 P, w1 G3 R. J7 Areturn 0;+ U, L ?3 N6 Q% J& m9 [
}; Y0 |( K: ~: A/ ]) U% N
! _0 Y0 _8 p) m$ Y, c6 F( m
void main(): _. l! K7 {8 v3 Q+ z, M) C
{8 q8 W5 L- A1 Y5 N/ W6 s% w7 ]
memset(mark,0,sizeof(mark));
4 g; J- ^' |2 `+ G( @memset(mark1,0,sizeof(mark1));& p# y/ l2 u% S" c* F2 ?6 e: w5 b
& a3 ]/ C/ O, b
min=100;
3 E$ A- U$ z0 ~$ I( e
9 m, i) z h8 i Nsearch(0,0);* ]1 @) w# U: _( s% C; B$ Y( `
) n" D4 A. N+ L1 ?1 q! ?
printf("%d\n",min);
* Z: X$ h; F0 N2 ?7 o1 I0 T}
" j$ q( l. r; Z4 S5 F$ T结果是14分钟。% R5 }9 b' J; R# W4 ^
提供一个思路:让走的慢的两人同时过桥。 |
|