编程解决过河问题

原创 2006年06月21日 17:37:00

问题是这样的:

一天夜晚,有四个人要过一条河,河上有一座只能承受两人重量的桥,而且桥面路况很差,要手持手电筒才能顺利通过。四人单独过河的时间分别为:2分钟、3分钟、8分钟和10分钟,并且只有一个手电筒。问:四人都过河的最短时间是多少?

大概编程思想是这样的:

(1)从四人中任挑两人过河,记录时间(两人中的慢者所需时间)

(2)让快者返回,记录时间

(3)从三人中任挑两人过河,记录时间(两人中的慢者所需时间)

(4)让快者返回,记录时间

(5)剩下两人过河,记录时间(两人中的慢者所需时间)

(6)求总时间并暂时存储,与下一个总时间比较求小值。直到试遍所有可能的组合,即得到最短时间。

以下是解题程序,都好几年了,现在连自己都看不懂了:(

#include<iostream.h>

static int b[4]={2,3,8,10};
static int a[4];
int num1,num2,time=0,result=100;

int min(int a,int b)
{  return a<b?a:b;  }

int max(int a,int b)
{  return a>b?a:b;  }

int min(int a,int b,int c)
{  a=a<b?a:b; return a<c?a:c;  }

void cross(int m,int n,int k,int r)
{
 int min,x,y,time2;
 time+=max(b[m],b[n]);
 num1=k-2; num2=4-num1;
 
  if(num2==2)
  {
   if(b[m]<b[n]){ min=b[m]; x=m; y=n; }
   else{ min=b[n]; x=n; y=m; }
  }
  
  else
  {
   if(b[m]<b[n]){ min=b[m]; x=m; y=n; }
   else { min=b[n]; x=n; y=m;}
   if(min<b[r]){ a[r]=-1; }
   else { min=b[r]; a[x]=-1; x=r; }
  }
  time+=min;
  num1++;
  if(num1==3)
   time2=time;
  a[x]=0; a[y]=-1;
  if(num1==2)
  {
   min=0;
   for(int k=0;k<4;k++)
    if(a[k]!=-1)
     min=max(min,b[k]); 
   time+=min;
   a[y]=0;
   return;
  }
  for(int i=0;i<3;i++)
   for(int j=i+1;j<4;j++)
   {
    if(a[i]!=-1 && a[j]!=-1)
    {
     cross(i,j,3,y);
     result=result<time?result:time;//result=min(result,time1);
     time=time2;
    }
   }
}

void main()
{
 int i,j;
 int alltime=100;
 for(i=0;i<3;i++)
 {
  for(j=i+1;j<4;j++)
  {
   for(int k=0;k<4;k++)
    a[k]=0;
   time=0;
   cross(i,j,4,0);
   alltime=min(alltime,result);
  }
  
 }
 cout<<"The least time is:"<<alltime<<endl;
}

用编程解决过河问题

很久没有做题了,突然很怀念,于是心血来潮,想起了曾经小弟叫我做的这道趣味题,就花了X个小时(此处不好意思打出来,各位脑补吧)的时间,终于解决了它,那种久违的成就感好像又回来了……但是我的方法不是特别好...
  • linghuainian
  • linghuainian
  • 2017年10月01日 21:26
  • 133

【算法编程】过河问题

今天偶尔想到了过河问题。记得读小学六年级的时候第一次接触到这个问题--六个老虎过河问题(百度上有详细介绍,本文解决的是一个简单的问题,下一篇文章中将讨论该问题),当时都是从逻辑思维的方法得到正确的解决...
  • tengweitw
  • tengweitw
  • 2014年05月08日 12:31
  • 2610

过河问题的图论解法

 有一个人带着一条狗、一只兔子、一篮白菜来到河边。河水很深,已经齐半腰,所以他每次只能带一样东西过河。但是当人不在时,狗要咬兔子,兔子要吃白菜,请问他该怎样过去? 当然我们用常用的方法也能解出来,但是...
  • eion
  • eion
  • 2007年03月31日 10:46
  • 3535

【人工智能】农夫过河问题

问题描述 一农夫带着一头狼,一只羊和一个白菜过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃白菜,只有农夫在时才安全。现欲让所有物品包括农夫都安全过道河对岸,求最佳算法。...
  • jiange_zh
  • jiange_zh
  • 2015年10月11日 12:05
  • 4471

POJ - 1700 Crossing River解题报告(过河问题的贪心策略)

题目大意:有n个人要过一条河,每个人过河都需要一个时间aia_i,有一艘船,每次过河只能最多装两个人。两个人划船过河所需的时间都取决于过河时间长的那个人。比如,A,B两人过河所需时间分别为a,b,那么...
  • qq_36306833
  • qq_36306833
  • 2017年04月01日 15:26
  • 1193

农夫过河问题实现

#include using namespace std; struct Condition { int farmer; int wolf; int sheep; int cabbage;...
  • jamesjxin
  • jamesjxin
  • 2011年10月20日 16:35
  • 4875

农夫过河问题(图的邻接矩阵)

/******************************************************************************* *农夫过河问题(图的邻接矩阵存储,深度...
  • qq_23693629
  • qq_23693629
  • 2015年11月12日 22:11
  • 802

NYOJ45:过河问题【贪心】

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论...
  • lin14543
  • lin14543
  • 2015年08月10日 15:24
  • 1173

我用c语言写了一个关于商人过河的问题

#include "stdio.h"#include "string.h"#include "conio.h"FILE *fp;/*设立文件指针,以便将它用于其他函数中*/struct a{long ...
  • backplace
  • backplace
  • 2004年03月08日 11:31
  • 1002

过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)

经典的过河问题,利用栈实现回溯,利用递归遍历各种状态,类似于迷宫寻路或者八皇后问题的解决方案。...
  • kangjianwei101
  • kangjianwei101
  • 2015年12月20日 20:11
  • 1396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程解决过河问题
举报原因:
原因补充:

(最多只允许输入30个字)