private void Recursive_Node_NextNode(int tesumi1, Node <T1, T2> node1, DELEGATE_Foreach <T1, T2> delegate_Foreach1, ref bool toFinish_ZenpukuTansaku) { bool toBreak1 = false; // このノードを、まず報告。 delegate_Foreach1(tesumi1, node1.Value, node1, ref toBreak1); if (toBreak1) { //この全幅探索を終わらせる指示が出ていた場合 toFinish_ZenpukuTansaku = true; goto gt_EndMetdhod; } // 次のノード node1.Foreach_NextNodes((string key2, Node <T1, T2> node2, ref bool toBreak2) => { bool toFinish_ZenpukuTansaku2 = false; this.Recursive_Node_NextNode(tesumi1 + 1, node2, delegate_Foreach1, ref toFinish_ZenpukuTansaku2); if (toFinish_ZenpukuTansaku2)//この全幅探索を終わらせる指示が出ていた場合 { toBreak2 = true; goto gt_EndBlock; } gt_EndBlock: ; }); gt_EndMetdhod: ; }
/// <summary> /// 全て。 /// </summary> /// <param name="endNode"></param> /// <param name="delegate_Foreach"></param> public void ForeachZenpuku(Node <T1, T2> startNode, DELEGATE_Foreach <T1, T2> delegate_Foreach) { List <Node <T1, T2> > list8 = new List <Node <T1, T2> >(); // // ツリー型なので、1本のリストに変換するために工夫します。 // // カレントからルートまで遡り、それを逆順にすれば、本譜になります。 // int tesumi = 0;//※指定局面が0。 bool toFinish_ZenpukuTansaku = false; this.Recursive_Node_NextNode(tesumi, startNode, delegate_Foreach, ref toFinish_ZenpukuTansaku); if (toFinish_ZenpukuTansaku) { goto gt_EndMetdhod; } gt_EndMetdhod: ; }
/// <summary> /// 本譜だけ。 /// </summary> /// <param name="endNode">葉側のノード。</param> /// <param name="delegate_Foreach"></param> public void ForeachHonpu(Node <T1, T2> endNode, DELEGATE_Foreach <T1, T2> delegate_Foreach) { bool toBreak = false; // 本譜(ノードのリスト) List <Node <T1, T2> > honpu = new List <Node <T1, T2> >(); // // ツリー型なので、1本のリストに変換するために工夫します。 // // カレントからルートまで遡り、それを逆順にすれば、本譜になります。 // while (null != endNode) //ルートを含むところまで遡ります。 { honpu.Add(endNode); // リスト作成 endNode = endNode.GetParentNode(); } honpu.Reverse(); // // 手済みを数えます。 // int temezumi = 0; //初期局面が[0] foreach (Node <T1, T2> item in honpu) //正順になっています。 { T2 sky = item.Value; delegate_Foreach(temezumi, sky, item, ref toBreak); if (toBreak) { break; } temezumi++; } }
/// <summary> /// 本譜だけ。 /// </summary> /// <param name="endNode"></param> /// <param name="delegate_Foreach"></param> public void ForeachHonpu(Node <T1, T2> endNode, DELEGATE_Foreach <T1, T2> delegate_Foreach) { bool toBreak = false; List <Node <T1, T2> > list8 = new List <Node <T1, T2> >(); // // ツリー型なので、1本のリストに変換するために工夫します。 // // カレントからルートまで遡り、それを逆順にすれば、本譜になります。 // while (null != endNode) //ルートを含むところまで遡ります。 { list8.Add(endNode); // リスト作成 endNode = endNode.PreviousNode; } list8.Reverse(); int tesumi = 0; //初期局面が[0] foreach (Node <T1, T2> item in list8) //正順になっています。 { T2 sky = item.Value; delegate_Foreach(tesumi, sky, item, ref toBreak); if (toBreak) { break; } tesumi++; } }