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

📄 node.cs

📁 8数码难题 深、广、a*
💻 CS
字号:
using System;
using System.Collections;

namespace chessAlg
{
	/// <summary>
	/// Summary description for node.
	/// </summary>
	public class Node
	{
		public String name;//名字,备用
		public Node father;//父节点引用
		public String arrayNodeString;//当前状态字符串,按array[0]-->array[8]顺序排列
		public String arrayNodeString1;//初始字符串
		public String arrayNodeString2;//目标字符串
		public int depth;//深度
		public int va;//启发函数值

		public Node(Node f,String s,String s1,String s2,int d)//构造函数
		{
			father=f;
			arrayNodeString=s;
			arrayNodeString1=s1;
			arrayNodeString2=s2;
			depth=d;
			va=Value();//算f值
		}

		private int Value()//算f值
		{
			//int re=ValueP()+3*ValueS()+depth;
			//int re=depth;
			int re=ValueP()+depth;
			return re;
		}
		private int Value(String ss)//同上
		{
			int re=ValueP(ss)+3*ValueS(ss)+depth;
			return re;
		}
		private int ValueP()//算P值
		{
			int p=0;
			for(int i=0;i<=8;i++)
			{
				p+=Distance(int.Parse(arrayNodeString[i].ToString()),arrayNodeString2.IndexOf(arrayNodeString[i].ToString()));
			}
			return p;
		}
		private int ValueP(String ss)//同上
		{
			int p=0;
			for(int i=0;i<=8;i++)
			{
				p+=Distance(int.Parse(ss[i].ToString()),arrayNodeString2.IndexOf(ss[i].ToString()));
			}
			return p;
		}
		private int Distance(int i,int j)//算距离
		{
			int d=0;
			switch(i)
			{
				case 0:
					switch(j)
					{
						case 0:
							d=0;
							break;
						case 1:
							d=1;
							break;
						case 2:
							d=2;
							break;
						case 3:
							d=1;
							break;
						case 4:
							d=2;
							break;
						case 5:
							d=3;
							break;
						case 6:
							d=2;
							break;
						case 7:
							d=3;
							break;
						case 8:
							d=4;
							break;
					}
					break;
				case 1:
					switch(j)
					{
						case 0:
							d=1;
							break;
						case 1:
							d=0;
							break;
						case 2:
							d=1;
							break;
						case 3:
							d=2;
							break;
						case 4:
							d=1;
							break;
						case 5:
							d=2;
							break;
						case 6:
							d=3;
							break;
						case 7:
							d=2;
							break;
						case 8:
							d=3;
							break;
					}//
					break;
				case 2:
				switch(j)
				{
					case 0:
						d=2;
						break;
					case 1:
						d=1;
						break;
					case 2:
						d=0;
						break;
					case 3:
						d=3;
						break;
					case 4:
						d=2;
						break;
					case 5:
						d=1;
						break;
					case 6:
						d=4;
						break;
					case 7:
						d=3;
						break;
					case 8:
						d=2;
						break;
				}
					break;
				case 3:
				switch(j)
				{
					case 0:
						d=1;
						break;
					case 1:
						d=2;
						break;
					case 2:
						d=3;
						break;
					case 3:
						d=0;
						break;
					case 4:
						d=1;
						break;
					case 5:
						d=2;
						break;
					case 6:
						d=1;
						break;
					case 7:
						d=2;
						break;
					case 8:
						d=3;
						break;
				}
					break;
				case 4:
				switch(j)
				{
					case 0:
						d=2;
						break;
					case 1:
						d=1;
						break;
					case 2:
						d=2;
						break;
					case 3:
						d=1;
						break;
					case 4:
						d=0;
						break;
					case 5:
						d=1;
						break;
					case 6:
						d=2;
						break;
					case 7:
						d=1;
						break;
					case 8:
						d=2;
						break;
				}
					break;
				case 5://
				switch(j)
				{
					case 0:
						d=3;
						break;
					case 1:
						d=2;
						break;
					case 2:
						d=1;
						break;
					case 3:
						d=2;
						break;
					case 4:
						d=1;
						break;
					case 5:
						d=0;
						break;
					case 6:
						d=3;
						break;
					case 7:
						d=2;
						break;
					case 8:
						d=1;
						break;
				}
					break;
				case 6:
				switch(j)
				{
					case 0:
						d=2;
						break;
					case 1:
						d=3;
						break;
					case 2:
						d=4;
						break;
					case 3:
						d=1;
						break;
					case 4:
						d=2;
						break;
					case 5:
						d=3;
						break;
					case 6:
						d=0;
						break;
					case 7:
						d=1;
						break;
					case 8:
						d=2;
						break;
				}
					break;
				case 7:
				switch(j)
				{
					case 0:
						d=3;
						break;
					case 1:
						d=2;
						break;
					case 2:
						d=3;
						break;
					case 3:
						d=2;
						break;
					case 4:
						d=1;
						break;
					case 5:
						d=2;
						break;
					case 6:
						d=1;
						break;
					case 7:
						d=0;
						break;
					case 8:
						d=1;
						break;
				}
					break;
				case 8:
				switch(j)
				{
					case 0:
						d=4;
						break;
					case 1:
						d=3;
						break;
					case 2:
						d=2;
						break;
					case 3:
						d=3;
						break;
					case 4:
						d=2;
						break;
					case 5:
						d=1;
						break;
					case 6:
						d=2;
						break;
					case 7:
						d=1;
						break;
					case 8:
						d=0;
						break;
				}
					break;
					
			}
			return d;
		}
		private int ValueS()//算S值
		{
			int s=0;
			if(arrayNodeString[4]=='0') s+=1;
			if(!IsClockWise(arrayNodeString[0],arrayNodeString[1])) s+=2;
			if(!IsClockWise(arrayNodeString[1],arrayNodeString[2])) s+=2;
			if(!IsClockWise(arrayNodeString[2],arrayNodeString[5])) s+=2;
			if(!IsClockWise(arrayNodeString[5],arrayNodeString[8])) s+=2;
			if(!IsClockWise(arrayNodeString[8],arrayNodeString[6])) s+=2;
			if(!IsClockWise(arrayNodeString[6],arrayNodeString[3])) s+=2;
			if(!IsClockWise(arrayNodeString[3],arrayNodeString[0])) s+=2;
			return s;
		}
		private int ValueS(String ss)//同上
		{
			int s=0;
			if(ss[4]=='0') s+=1;
			if(!IsClockWise(ss[0],ss[1])) s+=2;
			if(!IsClockWise(ss[1],ss[2])) s+=2;
			if(!IsClockWise(ss[2],ss[5])) s+=2;
			if(!IsClockWise(ss[5],ss[8])) s+=2;
			if(!IsClockWise(ss[8],ss[6])) s+=2;
			if(!IsClockWise(ss[6],ss[3])) s+=2;
			if(!IsClockWise(ss[3],ss[0])) s+=2;
			return s;
		}
		private bool IsClockWise(char a,char b)//判断是否顺时针
		{
			bool re=true;
			String s="0125863";
			int pos1=arrayNodeString2.IndexOf(a);
			int pos2=arrayNodeString2.IndexOf(b);
			if(pos1==4||pos2==4)
				re=false;
			else if(s.IndexOf(pos1.ToString())>s.IndexOf(pos2.ToString()))
				re=false;
			return re;
		}


		
		public Node()
		{

		}

		public bool IsEqual(String s)//判断字符串是否相等
		{
			if(arrayNodeString==s)
				return true;
			else return false;
		}
		
		public Node[] GetChildNodes(ArrayList nodeList)//取得扩展节点集(已扩展节点集)
		{
			int pos=arrayNodeString.IndexOf("0");
			ArrayList list=new ArrayList();
			int[] p;
			switch(pos)
			{
				case 0:
					p=new int[2];
					p[0]=1;
					p[1]=3;
					Do(list,p,arrayNodeString);
					break;
				case 1:
					p=new int[2];
					p[0]=0;
					p[1]=2;
					Do(list,p,arrayNodeString);
					break;
				case 2:
					p=new int[2];
					p[0]=1;
					p[1]=5;
					Do(list,p,arrayNodeString);
					break;
				case 3:
					p=new int[3];
					p[0]=0;
					p[1]=4;
					p[2]=6;
					Do(list,p,arrayNodeString);
					break;
				case 4:
					p=new int[4];
					p[0]=1;
					p[1]=3;
					p[2]=5;
					p[3]=7;
					Do(list,p,arrayNodeString);
					break;
				case 5:
					p=new int[3];
					p[0]=2;
					p[1]=4;
					p[2]=8;
					Do(list,p,arrayNodeString);
					break;
				case 6:
					p=new int[2];
					p[0]=3;
					p[1]=7;
					Do(list,p,arrayNodeString);
					break;
				case 7:
					p=new int[3];
					p[0]=4;
					p[1]=6;
					p[2]=8;
					Do(list,p,arrayNodeString);
					break;
				case 8:
					p=new int[2];
					p[0]=5;
					p[1]=7;
					Do(list,p,arrayNodeString);
					break;
			}
			CompareList(list,nodeList);//对list作处理,取出重复状态
			return ArrayList2NodeArray(this,list);//转Node数组
		}
		public Node[] GetChildNodes_AStar(ArrayList nodeList1,ArrayList nodeList2)//A*算法的取得扩展子节点
		{
			int pos=arrayNodeString.IndexOf("0");
			ArrayList list=new ArrayList();
			int[] p;
			switch(pos)
			{
				case 0:
					p=new int[2];
					p[0]=1;
					p[1]=3;
					Do(list,p,arrayNodeString);
					break;
				case 1:
					p=new int[2];
					p[0]=0;
					p[1]=2;
					Do(list,p,arrayNodeString);
					break;
				case 2:
					p=new int[2];
					p[0]=1;
					p[1]=5;
					Do(list,p,arrayNodeString);
					break;
				case 3:
					p=new int[3];
					p[0]=0;
					p[1]=4;
					p[2]=6;
					Do(list,p,arrayNodeString);
					break;
				case 4:
					p=new int[4];
					p[0]=1;
					p[1]=3;
					p[2]=5;
					p[3]=7;
					Do(list,p,arrayNodeString);
					break;
				case 5:
					p=new int[3];
					p[0]=2;
					p[1]=4;
					p[2]=8;
					Do(list,p,arrayNodeString);
					break;
				case 6:
					p=new int[2];
					p[0]=3;
					p[1]=7;
					Do(list,p,arrayNodeString);
					break;
				case 7:
					p=new int[3];
					p[0]=4;
					p[1]=6;
					p[2]=8;
					Do(list,p,arrayNodeString);
					break;
				case 8:
					p=new int[2];
					p[0]=5;
					p[1]=7;
					Do(list,p,arrayNodeString);
					break;
			}
			CompareList_AStar(list,nodeList1,nodeList2);
			return ArrayList2NodeArray(this,list);
		}
		private void Do(ArrayList list,int[] pos,String ss)
		{
			String s;
			for(int i=0;i<pos.Length;i++)
			{
				s=ss;
				int m=pos[i];
				s=ChangePos(s,"0",s[m].ToString());
				list.Add(s);
			}
		}
		private String ChangePos(String s,String a,String b)//a,b作交换
		{
			int pos1=s.IndexOf(a);
			int pos2=s.IndexOf(b);
			s=s.Replace(a,"c");
			s=s.Replace(b,"d");
			s=s.Replace("c",b);
			s=s.Replace("d",a);
			return s;
		}
		private void CompareList(ArrayList StringList,ArrayList nodeList)//比较是否存在
		{
			for(int i=0;i<StringList.Count;i++)
			{
				for(int j=0;j<nodeList.Count;j++)
				{
					if((String) StringList[i]==((Node) nodeList[j]).arrayNodeString)
					{
						StringList.RemoveAt(i);
						i--;
						break;
					}
				}
			}
		}

		private void CompareList_AStar(ArrayList StringList,ArrayList nodeList1,ArrayList nodeList2)//A*算法的扩展节点处理
		{
			for(int i=0;i<StringList.Count;i++)//查open
			{
				int flag=0;
				for(int j=0;j<nodeList1.Count;j++)
				{
					if((String) StringList[i]==((Node) nodeList1[j]).arrayNodeString)//open已有
					{
						int c1=this.depth+1;
						int c2=((Node) nodeList1[j]).depth;
						if(c1<c2) //f更好
						{
							((Node) nodeList1[j]).va=((Node) nodeList1[j]).va-((Node) nodeList1[j]).depth+this.depth+1;//改f
							((Node) nodeList1[j]).depth=this.depth+1;//改深度
							((Node) nodeList1[j]).father=this;//改指针
						}
  					    flag=1;
						break;
					}
				}
				if(flag==0)
				{
					for(int j=0;j<nodeList2.Count;j++)
					{
						if((String) StringList[i]==((Node) nodeList2[j]).arrayNodeString)
						{
							int c1=this.depth+1;
							int c2=((Node) nodeList2[j]).depth;
							if(c1<c2) 
							{
								((Node) nodeList2[j]).va=((Node) nodeList2[j]).va-((Node) nodeList2[j]).depth+this.depth+1;
								((Node) nodeList2[j]).depth=this.depth+1;
								((Node) nodeList2[j]).father=this;
								nodeList1.Add((Node) nodeList2[j]);
								nodeList2.RemoveAt(j);
								//j--;
							}
							flag=2;
							break;
						}
					}
				}
				if(flag!=0)
				{
					
					StringList.RemoveAt(i);
					i--;
				}
			}
			
		}

		private Node[] ArrayList2NodeArray(Node father,ArrayList list)//转node数组
		{
			Node[] n=new Node[list.Count];
			for(int i=0;i<list.Count;i++)
			{
				n[i]=new Node(this,(String) list[i],arrayNodeString1,arrayNodeString2,this.depth+1);
			}
			return n;
		}
	}
}

⌨️ 快捷键说明

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