示例#1
0
        private List<ICoordinates> ListOfRadius(ICoordinates co, int Radius)
        {
            ICoordinates cur=new CCoordinates();
            cur.Copy(co);
            List<ICoordinates> ret=new List<ICoordinates>();
            List<ICoordinates> allied=new List<ICoordinates>();
            Stack<ICoordinates> stack1 = new Stack<ICoordinates>();
            Stack<ICoordinates> stack2 = new Stack<ICoordinates>();
            Stack<ICoordinates> swap=null;
            ret.Add(co);
            bool [,]gone=new bool[maxX+1,maxY+1];

            stack1.Push(cur);
            gone[cur.X1, cur.Y1] = true;
            for(int y=0;y<Radius;y++)
            {
                while(stack1.Count!=0)
                {
                    cur=new CCoordinates();
                    cur.Copy(stack1.Pop());
                    allied=AlliedNodes(cur);
                    foreach (ICoordinates x in allied)
                    {
                        if(!gone[x.X1,x.Y1])
                        {
                            stack2.Push(x);
                            gone[x.X1,x.Y1]=true;
                        }
                    }
                }
                foreach( ICoordinates x in stack2)
                {
                    cur=new CCoordinates();
                    cur.Copy(x);
                    ret.Add(cur);
                }
                swap=stack2;
                stack2=stack1;
                stack1=swap;
            }
            return ret;
        }
示例#2
0
 //// internal static bool isAllied(ICoordinates pos, ICoordinates sos)
 // {
 //     ICoordinates x = new CCoordinates();
 //     x.Copy(pos);
 //     x.X1++;
 //     if (this.isNorm(x) && ISEQUAL(x, sos))
 //     {
 //         return true;
 //     }
 //     x.Copy(pos);
 //     x.X1--;
 //     if (isNorm(x) && ISEQUAL(x, sos))
 //     {
 //         return true;
 //     }
 //     x.Copy(pos);
 //     x.Y1++;
 //     if (isNorm(x) && ISEQUAL(x, sos))
 //     {
 //         return true;
 //     }
 //     x.Copy(pos);
 //     x.Y1--;
 //     if (isNorm(x) && ISEQUAL(x, sos))
 //     {
 //         return true;
 //     }
 //     return false;
 // }
 internal List<ICoordinates> MAKECOPY(List<ICoordinates> lol)
 {
     List<ICoordinates> ololo=new List<ICoordinates>();
     ICoordinates co=new CCoordinates();
     for(int i=0;i<lol.Count;i++)
     {
         co.Copy(lol[i]);
         ololo.Add(co);
         co=new CCoordinates();
     }
     return ololo;
 }
示例#3
0
        private bool isConnected()
        {
            ICoordinates empt=EmptyCoords[0]; // любой пустой элемент

            Stack<CCoordinates> stack=new Stack<CCoordinates>();
            CCoordinates lol=new CCoordinates();
            CCoordinates pushing=new CCoordinates();
            lol.Copy(empt);
            stack.Push(lol);
            int HowMuchEmpty=1; // сначала есть 1 пустая вершина
            bool [,]lables=new bool[maxX+1,maxY+1]; // false по умолчанию
            lables[lol.X1,lol.Y1]=true;
            while(stack.Count!=0)
            {
                lol=stack.Pop();
                foreach(ICoordinates x in this.AlliedNodes(lol))
                {
                    if((this.map[x.X1,x.Y1]!=TypesOfField.WALL)&&(!lables[x.X1,x.Y1]))
                    {
                        pushing = new CCoordinates();
                        pushing.Copy(x);
                        stack.Push(pushing);
                        HowMuchEmpty++;
                        lables[pushing.X1,pushing.Y1]=true;
                    }
                }
            }
            bool ret=false;
            if(HowMuchEmpty==EmptyCoords.Count)
                ret=true;

            return ret;
        }
示例#4
0
        /// <summary>
        /// Все соседние вершины в пределах поля
        /// </summary>
        /// <param name="lol">Для координаты</param>
        /// <returns></returns>
        internal List<ICoordinates> AlliedNodes(ICoordinates lol)
        {
            List<ICoordinates> ret=new List<ICoordinates>();
            ICoordinates x=new CCoordinates();
            x.Copy(lol);

            x.X1++;
            if(isNorm(x))
            {
                ret.Add(x);
                x = new CCoordinates();
            }
            x.Copy(lol);
            x.X1--;
            if(isNorm(x))
            {
                ret.Add(x);
                x = new CCoordinates();
            }
            x.Copy(lol);
            x.Y1++;
            if(isNorm(x))
            {
                ret.Add(x);
                x = new CCoordinates();
            }
            x.Copy(lol);
            x.Y1--;
            if(isNorm(x))
            {
                ret.Add(x);
            }
            return ret;
        }