看了莫伯特的算法题,写一个不管过桥人数及时间的程序,望博友给予指正:
前提:N个女人过桥,夜间有一火把,每次最多过两个,必需带火把,过桥速度不一样.
要求:实现最优过桥速度.
基本分析:在未过桥中选最少时间的两个人过桥,当过桥后选最少时间的人返回,此时火把交给返回的人,同时对己过桥的人进行统计,当还有三人未过桥时(包含返的人),让时间最大的两个人过桥,后将为把交给过桥后最少时间的再返回,最后两个最少时间的人过桥。
为了让易于操作对所有人按所需时间进行排序,后进行操作。
小记:刚开编写时把这一部分
for ( int i = 0; i < size; i++)
{
for (int j = i+1; j <size; j++)
{
if (w[i].Ctime > w[j].Ctime)
{
Woman p = w[i];
w[i] = w[j];
w[j] = p;
}
}
}
写成了
for ( int i = 0; i < size; i++)
{
for (int j = i+1; j <size; j++)
{
if (w[i].Ctime > w[j].Ctime)
{
int p = w[i].Ctime ;
w[i].Ctime = w[j].Ctime ;
w[j].Ctime = p;
}
}
}
虽然结果没有变化,但意义发生了改变,还是我老婆(JAVA程序员)历害看出来了,多谢她的s提醒。
namespace ConsoleApplication1
{
class Program
{
private static int sum;
private static Woman minTime1;
private static Woman minTime2;
static void Main(string[] args)
{
Random rd=new Random();
sum=0;
int size=int.Parse(Console.ReadLine());
int ditchWoman = 0;
Woman[] w = new Woman[size];
// 赋值并排序
for (int i = 0; i < size; i++)
{
w[i] = new Woman();
w[i].Ctime = rd.Next(i, size+10);
Console.WriteLine("第" + i.ToString() + "个人的过桥时间为:" + w[i].Ctime.ToString());
}
for ( int i = 0; i < size; i++)
{
for (int j = i+1; j <size; j++)
{
if (w[i].Ctime > w[j].Ctime)
{
Woman p = w[i];
w[i] = w[j];
w[j] = p;
}
}
}
//第一次时间最短的两个过桥
w[0].Ditch=true ;
w[1].Ditch=true ;
sum+=w[1].Ctime ;
//最少时间的返回
minTime1 = w[0];
minTime1.Ditch = false;
ditchWoman += 1;//对己过桥者计数
minTime1.Hfire = true;//返回者带上为把
sum+=minTime1.Ctime ;//返回时间记录
//从第三个人开始带除mintime之外的最少时间者过桥,如果只有三个人让两位最长时间者过桥
for (int i = 2; i < size; i++)
{
if (w[i].Ditch == false )
{
if (size - ditchWoman == 3)
{
w[i].Ditch = true;
w[i + 1].Ditch = true;
minTime1.Hfire = false;
w[i + 1].Hfire = true;
sum += w[i + 1].Ctime;
minTime2 = w[1];
minTime2.Hfire = true;
sum += minTime2.Ctime;
minTime1.Ditch = true;
minTime2.Ditch = true;
sum += minTime2.Ctime;
break;
}
else
{
ditchWoman += 1;
w[i].Ditch = true;
sum += w[i].Ctime;
sum += minTime1.Ctime;
}
}
}
Console.WriteLine("总计时间为:"+sum.ToString());
Console.Read();
}
}
public class Woman
{
private bool _ditch;//已过桥为true
public bool Ditch
{
get { return _ditch; }
set { _ditch = value; }
}
private bool _hfire;//拥有火把
public bool Hfire
{
get { return _hfire; }
set { _hfire = value; }
}
private int _ctime;//所用时间
public int Ctime
{
get { return _ctime; }
set { _ctime = value; }
}
}
项目管理笔记