fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. public class Test
  7. {
  8. public static void Main()
  9. {
  10. var researchTin = new Research { Name = "Tin" };
  11. var researchFire = new Research { Name = "Fire" };
  12. var researchWater = new Research { Name = "Water" };
  13. var researchIron = new Research { Name = "Iron" };
  14. var researchSteam = new Research { Name = "Steam" };
  15.  
  16. Dictionary<Research, List<Research>> requiredResearches =
  17. new Dictionary<Research, List<Research>>();
  18.  
  19. var req = new Research[] { researchTin };
  20. requiredResearches.Add(researchIron, req.ToList());
  21.  
  22. req = new Research[] { researchFire, researchWater, researchIron };
  23. requiredResearches.Add(researchSteam, req.ToList());
  24.  
  25.  
  26. var playerResearches = new List<Research>();
  27. playerResearches.Add(researchFire);
  28. //playerResearches.Add(researchWater);
  29. //playerResearches.Add(researchTin);
  30.  
  31. var chain = GetReq(requiredResearches, researchSteam);
  32.  
  33. var missing = chain.Where (c => playerResearches.Where (r => r == c).Any () == false).Distinct();
  34. foreach(var miss in missing)
  35. {
  36. Console.WriteLine(miss.Name);
  37. }
  38. }
  39.  
  40. public static IList<Research> GetReq(Dictionary<Research, List<Research>> reqs, Research target)
  41. {
  42. var chain = new List<Research>();
  43. if(reqs.ContainsKey(target))
  44. {
  45. foreach(var item in reqs[target])
  46. {
  47. chain.Add(item);
  48. chain.AddRange(GetReq(reqs, item));
  49. }
  50. }
  51. return chain;
  52. }
  53. }
  54.  
  55. public class Element
  56. {
  57. }
  58.  
  59. public class Research
  60. {
  61. public string Name { get; set; }
  62. }
  63.  
Success #stdin #stdout 0.03s 33888KB
stdin
null
stdout
Water
Iron
Tin