算法:N个女人过桥

看了莫伯特的算法题,写一个不管过桥人数及时间的程序,望博友给予指正:

前提: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; }
        }

    }
    

 

项目管理笔记
请使用浏览器的分享功能分享到微信等