S1:加载全部换乘结点方法HashtableLoadDC()
DCht.Add("XX",newdouble[]{-2,-1.4});上面是执行的一句代码,XX的坐标即为(-1,-1.4)用double类型后面要是地铁换乘站在X之前增加了那就直接写上小于-1.4的,反之大于1.4!否则若用int类型那耦合性太高了
这是不用int类型的好处!
S2:加载换乘站之间的关系{RelationforNode}方法HashSet
S3:现在我要查询B到E的最短路程搜索:B-E开始
S3_1:如果B,E都是换乘结点比如“西二旗”到“国贸”那直接进行第四步S4
S3_2:如果B,E中有一个不是换乘结点,执行方法HashSet
string[]Linecp={"西二旗","生命科学园","朱辛庄","巩华城","沙河","沙河高教园","南邵"};int[]Linecpnode={1,0,0,0,0,0,1};liststr.Add(Linecp);listint.Add(Linecpnode);1代表是换乘点或者是X号线的起点,0代表不是换乘结点
hs=newHashSet
while(pre>-1){if(tint[pre]==1)break;pre=pre-1;}intnext=b;while(next
现在返回可能值:(b1x,b1y),(b2x,b2y)可能值共有C(2,2)+C(3,2)+C(4,2)=10种可能
根据起点B和终点E查询出来了BE附近的可能结点然后用点到点的距离找出最多10中可能值的最小值返回min_b_node,min_e_node
S4:
现在已经有b_node,和e_node起点和终点附近最短距离的换乘结点,(最短距离不代表最短路程,因为有可能它们之间没有换乘关系)但不要紧,请看下面:
坐标中从一点出发到另一点的8种情况直接上代码:
boolCK(boolisadd,double[]bxy,double[]exy){if(dx>=0&&dy>=0&&exy[0]>=bxy[0]&&exy[1]>=bxy[1]&&exy[0]<=ex&&exy[1]<=ey)//1x增大y增大isadd=true;elseif(dx>=0&&dy<=0&&exy[0]>=bxy[0]&&exy[1]<=bxy[1]&&exy[0]<=ex&&exy[1]>=ey)//2x增大y减小isadd=true;elseif(dx<=0&&dy>=0&&exy[0]<=bxy[0]&&exy[1]>=bxy[1]&&exy[0]>=ex&&exy[1]<=ey)//3x减小y增大isadd=true;elseif(dx<=0&&dy<=0&&exy[0]<=bxy[0]&&exy[1]<=bxy[1]&&exy[0]>=ex&&exy[1]>=ey)//4x减小y减小isadd=true;elseif(dx>=0&&dy==0&&exy[0]>=bxy[0]&&exy[1]==bxy[1]&&exy[1]==ey&&exy[0]<=ex)//5x增大y不变isadd=true;elseif(dx==0&&dy>=0&&exy[0]==bxy[0]&&exy[1]>=bxy[1]&&exy[0]==ex&&exy[1]<=ey)//6x不变y增大isadd=true;elseif(dx<=0&&dy==0&&exy[0]<=bxy[0]&&exy[1]==bxy[1]&&exy[1]==by&&exy[0]>=ex)//7x减小y不变isadd=true;elseif(dx==0&&dy<=0&&exy[0]==bxy[0]&&exy[1]<=bxy[1]&&exy[0]==bx&&exy[1]>=ey)//8x不变y减小isadd=true;elseisadd=false;returnisadd;}
代码我就不用解释了,下面是核心代码
///O(n)foreach(stringstrbegininbeginlist){if(strbegin.IndexOf("-")==-1&&mainht.ContainsKey(strbegin)==true)//havethiskeyandfirstloaddata{bxy=(double[])DCht[strbegin];earry=mainht[strbegin].ToString().Split(',');foreach(stringarinearry){exy=(double[])DCht[ar];isadd=CK(isadd,bxy,exy);if(isadd==true){returnlist.Add(strbegin+"-"+ar);isend=0;}}}elseif(strbegin.IndexOf("-")>-1&&mainht.ContainsKey(strbegin.Substring(strbegin.LastIndexOf("-")+1))==true){temgstr=strbegin.Substring(strbegin.LastIndexOf("-")+1);bxy=(double[])DCht[temgstr];earry=mainht[temgstr].ToString().Split(',');//exchangenodeforeach(stringarinearry){exy=(double[])DCht[ar];isadd=CK(isadd,bxy,exy);if(isadd==true){if(!strbegin.Contains(ar))returnlist.Add(strbegin+"-"+ar);isend=0;}}}}}earry=null;if(isend==0)returnGetF(returnlist,i);elsereturnnull;
到这里本人有个问题请教:
Code1:if(fresult.Contains(temp)==false)fresult.Add(temp);Code2:fresult.Add(temp);Code1和Code2有什么区别?freault为hashset性能上的?????我看了java中的实现过程但是C#语言看不了实现过程只看了过程的描述!
后面的实现过程就很简单了!找到BE之间尽量短的可能路线的集合然后找出其中最短的路径程序结束!