public Jet(Jet N) { Now = (PointD)N.Now; Path = N.Path.ToList(); NowOil = N.NowOil; MaxOil = N.MaxOil; L = N.L; FlyCost = N.FlyCost; }
private void button1_Click(object sender, EventArgs e) { End = new PointD(5, 5); TL.Add(new Tower() { P = 2, Place = new PointD(2, 5), R = 2 }); TL.Add(new Tower() { P = 2, Place = new PointD(4, 2), R = 2 }); TL.Add(new Tower() { P = 1, Place = new PointD(5, 4), R = 3 }); w = 1; for (int i = 0; i <= costlimit; i++) { Jet j = new Jet(new PointD(1, 1), i); Recu(j); } }
void Recu(Jet NowJet) { Graphics g; double distemp = PointD.GetDistance(NowJet.Now, End); distemp = (distemp < 0.01d ? 0d : distemp); if (distemp == 0) { JL.Add(new Jet(NowJet)); int FCindex = JL.FindIndex(x => x.FlyCost == JL.Min(y => y.FlyCost)); if (tempindex != FCindex) { tempindex = FCindex; Show(JL[tempindex].Path); } Application.DoEvents(); return; } if (NowJet.NowOil < 0)//沒油了 { return; } if (distemp > NowJet.NowOil) { return; } Jet TempJet; if (true)//Point { int tempdis = (int)Math.Round(NowJet.NowOil, 0); if (tempdis < 0) { return; } for (int i = 0; i <= tempdis; i++) { for (int j = 0; j <= i; j++) { for (int k = 0; k <= i; k++) { TempJet = new Jet(NowJet); PointD NP = new PointD(TempJet.Now.X + j, TempJet.Now.Y + k); bool flag = false; foreach (var item in TempJet.Path) { if (item.X == NP.X && item.Y == NP.Y) { flag = true; break; } } if (flag) { continue; } TempJet.FlyPoint(new PointD(i, j), TL, w); Recu(TempJet); } } } } else//Angle { for (int i = 0; i <= 90; i += 1) { TempJet = new Jet(NowJet); TempJet.FlyAngle(i, TL, w); Recu(TempJet); } } }