2017-04-07 57 views
0

我編碼一個小程序,試圖計算有多少機器人可以在5,10和20秒內逃到一個洞,機器人以10米/秒的速度行進。列表中的對象似乎共享字典鍵和虛值

機器人和孔有兩個浮點數作爲座標,並找出孔和我使用畢達哥拉斯定理機器人之間的距離。

爲了跟蹤哪個機器人最靠近一個孔,我爲每個孔配備了一個以機器人id爲關鍵字的字典以及它們與孔的距離作爲值。

也可以有不同的場景,最大10,不同的數字和洞。

輸入看起來像這樣,其中第一個數字N是場後機器人的數量,後面是N行X/Y座標。其次是數字M,其是M行X/Y座標之後的孔的數量。

輸入一個0

3 
0.0 0.0 
10.0 0.0 
0.0 10.0 
3 
99.0 0.0 
0.0 1000.0 
1000.0 1000.0 
3 
0.0 0.0 
100.0 0.0 
200.0 0.0 
2 
95.0 50.0 
105.0 50.0 
0 

結束Theese是我的班

class Robot 
{ 
    public int Id { get; private set; } 
    public double PosX { get; private set; } 
    public double PosY { get; private set; } 
    public bool isHiding { get; set; } 

    public Robot(double posX, double posY, int id) 
    { 
     PosX = posX; 
     PosY = PosY; 
     Id = id; 
    } 
} 

class Hole 
{ 
    public Dictionary<int, double> Candidates { get; set; }   
    public double PosX { get; private set; } 
    public double PosY { get; private set; } 
    public bool isOccupied { get; set; } 
    public Hole(double posX, double posY) 
    { 
     PosX = posX; 
     PosY = posY; 
    } 
} 

class Scenario 
{ 
    public int Id { get; private set; } 
    public List<Duration> Durations { get; set; } 

    public Scenario(int id) 
    { 
     Id = id; 
    } 
} 

class Duration 
{ 
    public int Time { get; private set; } 
    public int Survivors { get; set; } 
    public List<Robot> Robots { get; set; } 
    public List<Hole> Holes { get; set; } 

    public Duration(int time) 
    { 
     Time = time; 
    } 

} 

我收集這樣的投入,而這正是我相信的東西可能是問題。雖然對我來說,似乎所有的對象都是正確的。

void CollectInputs() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Scenario scenario = new Scenario(i + 1); 
     List<Duration> durations = new List<Duration>(); 

     List<Robot> robots = new List<Robot>(); 
     List<Hole> holes = new List<Hole>(); 

     int newRobots = int.Parse(Console.ReadLine()); 
     if (newRobots == 0) 
     { 
      break; 
     } 

     for (int iii = 0; iii < newRobots; iii++) 
     { 
      string[] inputCoordsRobot = Console.ReadLine().Split(' '); 
      Robot robot = new Robot(double.Parse(inputCoordsRobot[0], CultureInfo.InvariantCulture), double.Parse(inputCoordsRobot[1], CultureInfo.InvariantCulture), iii + 1); 
      robots.Add(robot); 
     } 

     int newHoles = int.Parse(Console.ReadLine()); 
     for (int iii = 0; iii < newHoles; iii++) 
     { 
      string[] inputCoordsHole = Console.ReadLine().Split(' '); 
      Hole hole = new Hole(double.Parse(inputCoordsHole[0], CultureInfo.InvariantCulture), double.Parse(inputCoordsHole[1], CultureInfo.InvariantCulture)); 
      holes.Add(hole);    
     } 

     for (int ii = 5; ii <= 20; ii = ii + ii) 
     { 

      Duration duration = new Duration(ii); 

      duration.Robots = new List<Robot>(robots); 
      duration.Holes = new List<Hole>(holes); 

      durations.Add(duration); 

      scenario.Durations = new List<Duration>(durations); 

     } 
     _scenarios.Add(scenario); 
    } 

} 

這是距離計算。

void UnleashStorm() 
     { 
      foreach (var scenario in _scenarios) 
      { 
       foreach (var duration in scenario.Durations) 
       { 
        double movementCapacity = duration.Time * 10.0f; 

        foreach (var hole in duration.Holes) 
        { 
         Dictionary<int,double> robotsInRange = new Dictionary<int, double>(); 

         foreach (var robot in duration.Robots) 
         { 
          double distanceToX = robot.PosX > hole.PosX ? robot.PosX - hole.PosX : hole.PosX - robot.PosX; 
          double distanceToY = robot.PosY > hole.PosY ? robot.PosY - hole.PosY : hole.PosY - robot.PosY; 

          double distanceToHole = Math.Sqrt(Math.Pow(distanceToX, 2) + Math.Pow(distanceToY, 2)); 

          if (distanceToHole <= movementCapacity) 
          { 
           robotsInRange.Add(robot.Id, distanceToHole); 
          } 

         } 

         hole.Candidates = new Dictionary<int, double>(robotsInRange); 
        } 
       } 
      } 
     } 

我注意到,對於如果事情是添加到特定孔中的每個時間dictoinary鍵和值似乎是在所有期限的計算方法,相同的孔之間共享的調試器。

我認爲這是一個問題,我投擲指針在輸入收集方法或計算距離方法,但我似乎無法找出一個壞的方式。

任何幫助解決這個問題將不勝感激。

+2

這裏唯一的字典是「字典'。大多數字典問題都是人們把複雜類型作爲關鍵詞,並且把它弄得一團糟 - 然而,'int'和'double'知道如何表現,所以:忘記字典本身,這不是問題。如果數據亂七八糟,則必須調試原因,但是:我沒有看到足夠的上下文以供我們取消該問題。 –

+0

感謝您的迅速響應。出現此問題時使用的數據是上面顯示的輸入數據。有什麼我可以添加,以更好地瞭解這個問題? –

+0

'持續時間。洞=新列表(洞);'你創建一個新的列表,並將'洞'的引用添加到新列表中。當你修改洞'hole.Candidates = new Dictionary (robotsInRange);'時,這會導致問題。 –

回答

0

的問題不是來自字典,它是從參考副本duration.Holes = new List<Hole>(holes);所有durations.Holes分享你CollectInputs

創建爲了避免這種holes列表的引用,你需要的holes值賦給duration.Holes。一種選擇是讓Hole類可被複制

 class Hole : ICloneable 
     { 
      public Dictionary<int, double> Candidates { get; set; } 
      public double PosX { get; private set; } 
      public double PosY { get; private set; } 
      public bool isOccupied { get; set; } 
      public Hole(double posX, double posY) 
      { 
       PosX = posX; 
       PosY = posY; 

      } 

      public object Clone() 
      { 
       var hole = new Hole(this.PosX, this.PosY) 
       { 
        isOccupied = this.isOccupied, 
        Candidates = this.Candidates 
       }; 
       return hole; 
      } 
     } 

    // and replace 
    // duration.Holes = new List<Hole>(holes); 
    // to 
    duration.Holes = new List<Hole>(holes.Select(x=>x.Clone() as Hole)); 

您可能必須在您使用參考其他地方,檢查一下。

+0

啊哈謝謝你的朋友對我的代碼的出色解決方案和理解,這解決了我的問題。 –