Пример #1
0
        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:
            ;
        }
Пример #2
0
        /// <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:
            ;
        }
Пример #3
0
        /// <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++;
            }
        }
Пример #4
0
        /// <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++;
            }
        }