Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340602
  • 博文数量: 88
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 885
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 14:50
文章分类

全部博文(88)

文章存档

2010年(88)

我的朋友

分类: C/C++

2010-09-07 16:50:54

现在小明一家过一座桥,过桥的时候是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要八秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问小明一家如何过桥?(原本是个智力题,这里用程序来求解)
#include "stdafx.h"
#define N    5
#define SIZE 64
 
// 将人员编号:小明-0,弟弟-1,爸爸-2,妈妈-3,爷爷-4
// 每个人的当前位置:0--在桥左边, 1--在桥右边
int Position[N];   
// 过桥临时方案的数组下标; 临时方案; 最小时间方案;
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=0; i++)
        {
            Scheme[i]=TmpScheme[i];
        }
    }else if(Direction==1){                        // 过桥方向向右,从桥左侧选出两人过桥
        for(int i=0; i
        {
            if(Position[i]==0 && CurTime+Time[i]
                TmpScheme[Index++] = i;
                Position[i] = 1;
                for(int j=0; j
                {
                    int TmpMax = (Time[i]>Time[j] ? Time[i] : Time[j]);
                    if(Position[j]==0 && CurTime+TmpMax
                    {
                        TmpScheme[Index++] = j;   
                        Position[j] = 1;       
                        Find(Remnant-2, CurTime+TmpMax, !Direction);
                        Position[j] = 0;       
                        TmpScheme[--Index] = -1;
                    }
                }
                Position[i] = 0;
                TmpScheme[--Index] = -1;
            }
        }
    }else{        // 过桥方向向左,从桥右侧选出一个人回来送灯
        for(int j=0; j
        {
            if(Position[j]==1 && CurTime+Time[j] < MinTime)
            {
                TmpScheme[Index++] = j;
                Position[j] = 0;
                Find(Remnant+1, CurTime+Time[j], !Direction);
                Position[j] = 1;
                TmpScheme[--Index] = -1;
            }
        }
    }
}
int main(int argc, char* argv[])
{
    for(int i=0; i// 初始方案内容为负值,避免和人员标号冲突
        Scheme[i] = TmpScheme[i] = -1;
 
Find(N, 0, 1);                   // 查找最佳方案
 
    printf("MinTime=%d:", MinTime); // 输出最佳方案
    for(int i=0; i=0; i+=3)
        printf(" %d-%d %d", Scheme[i], Scheme[i+1], Scheme[i+2]);
    printf("\b\b ");
    return getchar();
}
 
阅读(950) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-10 20:22:58

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com