public bool Check(BoxMovingStep movingStep)
        {
            KakuBoxState state = (KakuBoxState)movingStep.Final;

            var finds = queue.FindSameBoxState(state);

            if (finds.Count > 0)
            {
                foreach (var find in finds)
                {
                    if (find.Kaku.Equals(state.Kaku))
                    {
                        return(false);
                    }
                    else
                    {
                        var newMap = new ExtendedMap(this.map, find.Boxs);

                        PointToPointPathFinder pathFinder = new PointToPointPathFinder(newMap, find.Kaku);

                        if (pathFinder.HasPath(state.Kaku))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
        public bool Check(BoxMovingStep movingStep)
        {
            KakuBoxMovingStep thisStep = movingStep as KakuBoxMovingStep;

            if (thisStep == null)
            {
                throw new InvalidOperationException("KakuMovingCheckPolicy only can check non null KakuBoxMovingStep.");
            }

            if (((KakuBoxState)thisStep.Orignal).Kaku == thisStep.KakuPushingPoint)
            {
                return(true);
            }

            var newMap = new ExtendedMap(this.map, thisStep.Orignal.Boxs);

            if (!newMap.IsValidPoint(thisStep.kakuPushingPoint))
            {
                return(false);
            }

            PointToPointPathFinder pathFinder = new PointToPointPathFinder(newMap, ((KakuBoxState)thisStep.Orignal).Kaku);

            return(pathFinder.HasPath(thisStep.KakuPushingPoint));
        }