四人过桥——微软题的计算机模拟算法

问题:四人夜过桥,步行时间分别为 1、2、5、10 分钟,四人只有一台手电筒,一趟最多两人过桥,一趟过桥须持手电筒,时间以最慢者计,问 17 分钟内可否过桥,如何过桥?


#define STATE char #define PATH char const int TimeLimit = 17; STATE State[16] = { 1 }; PATH Path[16]; const int Cop[10] = { 1, 2, 4, 8, 3, 5, 9, 6, 10, 12 }; const char* Cops[10] = { "1,耗时 1 分", "2,耗时 2 分", "5,耗时 5 分", "10,耗时 10 分", "1 和 2,耗时 2 分", "1 和 5,耗时 5 分", "1 和 10,耗时 10 分", "2 和 5,耗时 5 分", "2 和 10,耗时 10 分", "5 和 10,耗时 10 分" }; const int Time[10] = { 1, 2, 5, 10, 2, 5, 10, 5, 10, 10 }; void Ferry ( int state, int dir, int p, int time ) { int i, cop, j; for ( i = 0; i < 10; i++ ) { if ( Cop[i] != (cop = state & Cop[i] ) ) continue; state &= ~cop; time += Time[i]; if ( State[ dir ? ~state & 15 : state ] || time > TimeLimit ) { state |= cop; time -= Time[i]; } else if ( dir && !state ) { Path[p] = i; printf ( "过桥过程,共往返 %d 次:/n", p + 1 ); for ( j = 0; j <= p; j++ ) printf ( "%s: %s/n", ( j & 1 ? "右往左" : "左往右" ), Cops[Path[j]] ); printf ( "/n" ); break; } else { State[ dir ? ~state & 15 : state ] = 1; Path[p] = i; Ferry ( ~state & 15, !dir, p + 1, time ); State[ dir ? ~state & 15 : state ] = 0; time -= Time[i]; state |= cop; } } } // 调用时 Ferry ( 15, 1, 0, 0 );


运行可知 17 分种有两解,变更 TimeLimit 值便可求得其它限定时间情况下的解。


参考:

《“人狼羊草”的计算机模拟的暴力枚举》

《生日悖论的泛化问题的讨论》

《智力题:将 4444 的 4444 次方连三次求位数和之数》

《ABCD*E=DCBA》

《对百度百科的疑问:水仙花数的上界是不是卡得太紧了?》

《独一无二的 153 ?竟然没有可与之比肩的第二个数了么?》

《解析 Miller - Rabin 素数测试思想》

《C++ 0x(C++ 09)新标准全部革新提案文档列表》

 

数学分类

 

《微软全部产品整理》

《我眼中的微软大战略和中国软件之殇》

《我眼中的 F# 的前景和 C# 的失败》

你可能感兴趣的:(《!——,代码集,——》,数学和算法,光宇广贞)