过桥问题
来源:互联网 发布:java int super 编辑:程序博客网 时间:2024/04/19 12:20
- #include <iostream>
- using namespace std;
- const int N = 5;
- const int SIZE = (N - 2) * 3 + 2;
- // 将人员编号:小明-0,弟弟-1,爸爸-2,妈妈-3,爷爷-4
- // 每个人的当前位置:0--在桥左边, 1--在桥右边
- int Position[N] = {0};
- // 过桥临时方案的数组下标; 临时方案; 最小时间方案;
- int Index, TmpScheme[SIZE], Scheme[SIZE];
- // 最小过桥时间总和,初始值100;每个人过桥所需要的时间
- int MinTime=100, Time[N]={1, 3, 6, 8, 12};
- // 寻找最佳过桥方案。Remnant:未过桥人数; CurTime:当前已用时间;
- // Direction:过桥方向,1--向右,0--向左
- void Find(int Remnant, int CurTime, int Direction)
- {
- if (Remnant == 0)
- {
- MinTime = CurTime;
- for (int i = 0; i < SIZE; ++i)
- {
- Scheme[i] = TmpScheme[i];
- }
- }
- else if (Direction == 1)
- {
- for (int i = 0; i < N; ++i)
- {
- if (Position[i] == 0 && CurTime + Time[i] < MinTime)
- {
- TmpScheme[Index++] = i;
- Position[i] = 1;
- for (int j = 0; j < N; ++j)
- {
- int TmpMax = (Time[i] > Time[j] ? Time[i] : Time[j]);
- if (Position[j] == 0 && CurTime + TmpMax < MinTime)
- {
- TmpScheme[Index++] = j;
- Position[j] = 1;
- Find(Remnant-2, CurTime + TmpMax, !Direction);
- TmpScheme[--Index] = -1;
- Position[j] = 0;
- }
- }
- TmpScheme[--Index] = -1;
- Position[i] = 0;
- }
- }
- }
- else
- {
- for (int i = 0; i < N; ++i)
- {
- if (Position[i] == 1 && CurTime + Time[i] + Time[i] < MinTime)
- {
- TmpScheme[Index++] = i;
- Position[i] = 0;
- Find(Remnant + 1, CurTime + Time[i], !Direction);
- Position[i] = 1;
- TmpScheme[--Index] = -1;
- }
- }
- }
- }
- int main(int argc, char* argv[])
- {
- int i;
- for(i=0; i<SIZE; i++) // 初始方案内容为负值,避免和人员标号冲突
- Scheme[i] = TmpScheme[i] = -1;
- Find(N, 0, 1); // 查找最佳方案
- cout << "MinTime=:" << MinTime << endl; // 输出最佳方案
- for(i=0; i<SIZE - 2; i+=3)
- {
- cout << Scheme[i] << "-" << Scheme[i+1] << " " << Scheme[i+2] << endl;
- }
- cout << Scheme[i+1] << "-" << Scheme[i + 2] <<endl;
- return 0;
- }