您的位置:首页 > 理论基础

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

2009-08-24 18:56 711 查看
问题:四人夜过桥,步行时间分别为 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# 的失败》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐