⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 path.cs

📁 A star 算法求解最短路径问题
💻 CS
字号:
using System;
using System.Collections;

namespace Path_UProject
{
	/// <summary>
	/// This class implements A*
	/// </summary>
	public class Path : IComparable
	{
		public Path(int gi, int gj)
		{
			p = new ArrayList();
			this.gi=gi;
			this.gj=gj;
		}

		public ArrayList p;
		public int gi;
		public int gj;

		public int CompareTo(Object rhs)
		{
			Path p = (Path) rhs;
			if (this.F()<p.F())
				return -1;
			else if(this.F()>p.F())
				return 1;
			else
				return 0;
		}

		public void AddNode(int i, int j)
		{
            Node n = new Node();
			n.i=i;
			n.j=j;

			p.Add(n);
		}

		public void Extend(ref ArrayList ar, ref int[,] map)
		{
			Node n = (Node)p[p.Count-1];

			Path p1 = new Path(gi,gj);
			Path p2 = new Path(gi,gj);
			Path p3 = new Path(gi,gj);
			Path p4 = new Path(gi,gj);

			p1.p = (ArrayList)this.p.Clone();
			p2.p = (ArrayList)this.p.Clone();
			p3.p = (ArrayList)this.p.Clone();
			p4.p = (ArrayList)this.p.Clone();

			int i=n.i,j=n.j;

			if(n.i>=1)
			{
				Node nn = new Node();
				i--;
				if((map[i,j]!=1))
				{
					nn.i=i;
					nn.j=j;
					p1.p.Add(nn);
					ar.Add(p1);
				}
				i++;
			}

			if(p.Count>=2)
			{
				for(int co=0;co<=p.Count-2;co++)
				{
					Node otl = (Node)p[co];
					i--;
					if((otl.i==i)&&(otl.j==j))
					{
						ar.RemoveAt(ar.Count-1);
					}
					i++;
				}
			}

			if(n.i<=8)
			{
				Node nn = new Node();
				i++;
				if(map[i,j]!=1)
				{
					nn.i=i;
					nn.j=j;
					p2.p.Add(nn);
					ar.Add(p2);
				}
				i--;
			}

			if(p.Count>=2)
			{
				for(int co=0;co<=p.Count-2;co++)
				{
					Node otl = (Node)p[co];
					i++;
					if((otl.i==i)&&(otl.j==j))
					{
						ar.RemoveAt(ar.Count-1);
					}
					i--;
				}
			}
			
			if(n.j>=1)
			{
				Node nn = new Node();
				j--;
				if(map[i,j]!=1)
				{
					nn.i=i;
					nn.j=j;
					p3.p.Add(nn);
					ar.Add(p3);
				}
				j++;
			}

			if(p.Count>=2)
			{
				for(int co=0;co<=p.Count-2;co++)
				{
					Node otl = (Node)p[co];
					j--;
					if((otl.i==i)&&(otl.j==j))
					{
						ar.RemoveAt(ar.Count-1);
					}
					j++;
				}
			}

			if(n.j<=8)
			{
				Node nn = new Node();
				j++;
				if(map[i,j]!=1)
				{
					nn.i=i;
					nn.j=j;
					p4.p.Add(nn);
					ar.Add(p4);
				}
				j--;
			}
			if(p.Count>=2)
			{
				for(int co=0;co<=p.Count-2;co++)
				{
					Node otl = (Node)p[co];
					j++;
					if((otl.i==i)&&(otl.j==j))
					{
						ar.RemoveAt(ar.Count-1);
					}
					i--;
				}
			}

		}

		public int F()
		{
			Node n = (Node)p[p.Count-1];
			return (int)(p.Count+(Math.Abs(gi-n.i)+Math.Abs(gj-n.j))*1);
		}

		public bool Finished()
		{
            Node n = (Node)p[p.Count-1];
			if ((n.i==gi)&&(n.j==gj))
				return true;
			else
				return false;
		}

		public void ReplaceTheBetter(ref ArrayList ar)
		{
			for (int i=0; i<=ar.Count-2; i++)
			{
				Path p1=(Path)ar[i];
				for (int j=i+1; j<=ar.Count-1; j++)
				{
					Path p2=(Path)ar[j];

//					for (int k1=1; k1<=p1.p.Count-1; k1++)
//					{
						Node n1 = (Node)p1.p[p1.p.Count-1];
						for (int k2=0; k2<=p2.p.Count-1; k2++)
						{
							Node n2 = (Node)p2.p[k2];

							if ((n1.i==n2.i)&&(n1.j==n2.j))
							{
								if (p1.p.Count-1>=k2)
								{
									ar.RemoveAt(i);
									return;
								}
								else if (p1.p.Count-1<k2)
								{
									ar.RemoveAt(j);
									return;
								}
							}

						}
//					}
				}
			}
		
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -