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; }
//// 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; }
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; }
/// <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; }