首页 > Linux操作系统 > Linux操作系统 > 算法N人过桥,不知是否是最短了!
public class BrigeAcross
{
private int[] passed, waiting;
private int sum = 0, size = 0;
///
/// 过桥
///
/// 数组地址
/// 数组地址
/// 类型,1:过桥,2:回来
private void SetCross(int index1, int index2,int type)
{
if (type == 1)
{
Console.Write("过去:"+waiting[index1].ToString()+","+waiting[index2].ToString());
if (waiting[index1] < waiting[index2]) sum += waiting[index2]; else sum += waiting[index1];
passed[index1] = waiting[index1]; passed[index2] = waiting[index2];
waiting[index1] = 0; waiting[index2] = 0;
}
else
{
Console.Write("回来"+passed[index1].ToString() + "," + passed[index2].ToString());
if (passed[index1] < passed[index2]) sum += passed[index2]; else sum += passed[index1];
waiting[index1] = passed[index1]; waiting[index2] = passed[index2];
passed[index1] = 0; passed[index2] = 0;
}
}
///
/// 过桥
///
/// 数组地址
/// 类型,1:过桥,2:回来
private void SetCross(int index1, int type)
{
if (type == 1)
{
Console.Write("回来" + waiting[index1].ToString());
sum += waiting[index1];
passed[index1] = waiting[index1];
waiting[index1] = 0;
}
else
{
Console.Write("回来" + passed[index1].ToString());
sum += passed[index1];
waiting[index1] = passed[index1];
passed[index1] = 0;
}
}
///
/// 获得实际长度
///
/// 类型,1:过桥,2:回来
private int GetLength(int type)
{
int len = 0;
if (type == 1) { for (int i = 0; i < size; i++) if (waiting[i] != 0) len++; }
else { for (int i = 0; i < size; i++) if (passed[i] != 0) len++; }
return len;
}
///
/// 获得最小值
///
/// 类型,1:过桥,2:回来
private int GetMin(int type)
{
if (type == 1) { for (int i = 0; i < size; i++) if (waiting[i] != 0) return i; }
else { for (int i = 0; i < size; i++) if (passed[i] != 0) return i; }
return 0;
}
///
/// 获取数组中第N大值
///
/// 类型,1:过桥,2:回来
/// 数组中第N大值
///
private int GetMax(int type,int num)
{
int j = 1;
if (type == 1) { for (int i = size-1; i > 0; i--) if (waiting[i] != 0) { if (j == num)return i; else j++; } }
else { for (int i = size-1; i > 0; i--) if (passed[i] != 0) { if (j == num)return i; else j++; } }
return 0;
}
public void StartPass()
{
Console.Write("第1轮");
SetCross(0, 1, 1);//过桥
SetCross(0, 2);//回来
Console.WriteLine();
//第一轮结束
for (int i = 0; i < size - 2; i++)
{
Console.Write("第"+(i+2).ToString()+"轮");
if (GetLength(1) > 3)
{
SetCross(GetMax(1, 1), GetMax(1, 2), 1);//过桥
SetCross(GetMin(2), 2);//回来
}
else
{
SetCross(GetMin(1),GetMax(1,1),1);
if (i < size - 3)
SetCross(GetMin(2), 2);//回来
}
Console.WriteLine();
}
Console.WriteLine("总计时间为:" + sum.ToString());
}
public void Go()
{
size = int.Parse(Console.ReadLine());
waiting = new int[size]; passed = new int[size];
Random rd = new Random();
for (int i = 0; i < size; i++)
{
waiting[i] = rd.Next(i, size + 10);
Console.WriteLine("第" + (i + 1).ToString() + "个人的过桥时间为:" + waiting[i].ToString());
}
Console.WriteLine("");
int sortTmp = 0;
for (int i = 0; i < size; i++)
{
for (int j = i + 1; j < size; j++)
{
if (waiting[i] > waiting[j])
{
sortTmp = waiting[i];
waiting[i] = waiting[j];
waiting[j] = sortTmp;
}
}
}
for (int i = 0; i < size; i++)
{
Console.WriteLine("第" + (i + 1).ToString() + "个人的过桥时间为:" + waiting[i].ToString());
}
Console.WriteLine("");
StartPass();//开始过桥
Console.Read();
}
}1.开始从等待队伍中选取最小过桥消耗时间的两个过桥进入已过桥队伍中结果:
2.从已过桥队伍中选取最短过桥消耗时间的人回去到等待队伍中.
3.从这里开始有1个分支:4.循环2~3可得出结果.
- 当人数大于三人时:选取等待队伍中最大和第二大过桥时间的人到已过桥队伍中回来时按2回来
- 当人数不大于三人时:选取队伍中最小和最大过桥时间的人到已过桥队伍中回来时按2回来
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-609977/ ,如需转载,请注明出处,否则将追究法律责任。