问题:四人夜过桥,步行时间分别为 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# 的失败》