Exemplo n.º 1
0
        public void CreateSolution()
        {
            int[][] ways = new int[poleSize][];
            for (int i = 0; i < poleSize; i++)
            {
                ways[i] = new int[poleSize];
                for (int j = 0; j < poleSize; j++)
                {
                    ways[i][j] = 0;
                }
            }
            ways[start.position_y][start.position_x] = 1;
            dotData = new PathDotStack();

            bool isFound = FindPath(start, finish, ways);

            if (isFound)
            {
                PoleDot prevDot;
                PoleDot curDot = finish;
                path.dots.Add(curDot);
                while (!dotData.IsEmpty())
                {
                    prevDot = dotData.GetDot();
                    path.dots.Add(prevDot);
                    if (curDot.position_x < prevDot.position_x)
                    {
                        path.lines.Add(curDot.right);
                    }
                    else if (curDot.position_x > prevDot.position_x)
                    {
                        path.lines.Add(curDot.left);
                    }
                    else if (curDot.position_y < prevDot.position_y)
                    {
                        path.lines.Add(curDot.down);
                    }
                    else if (curDot.position_y > prevDot.position_y)
                    {
                        path.lines.Add(curDot.up);
                    }
                    curDot = prevDot;
                }
                path.dots.Reverse();
                path.lines.Reverse();
            }
        }
Exemplo n.º 2
0
 public void AddLine(PoleLine newLine, PoleDot anotherDot)
 {
     if (position_x < anotherDot.position_x)
     {
         right = newLine;
     }
     else if (position_x > anotherDot.position_x)
     {
         left = newLine;
     }
     else if (position_y < anotherDot.position_y)
     {
         down = newLine;
     }
     else if (position_y > anotherDot.position_y)
     {
         up = newLine;
     }
 }
Exemplo n.º 3
0
        public void AddDot(PoleDot newDot)
        {
            DotNode curNode = new DotNode
            {
                dot = newDot
            };

            if (head == null)
            {
                head = curNode;
                size = 1;
            }
            else
            {
                curNode.next = head;
                head         = curNode;
                size++;
            }
        }
Exemplo n.º 4
0
 public Pole(int size, int seed)
 {
     path        = new PolePath();
     myRandGen   = new MyRandom(seed);
     poleSize    = size;
     eltsManager = new PoleElts();
     poleDots    = new PoleDot[size][];
     poleLines   = new List <PoleLine>();
     for (int y = 0; y < size; y++)
     {
         poleDots[y] = new PoleDot[size];
         for (int x = 0; x < size; x++)
         {
             poleDots[y][x] = new PoleDot(x, y);
         }
     }
     for (int y = 0; y < size; y++)
     {
         for (int x = 0; x < size - 1; x++)
         {
             PoleLine line = new PoleLine(poleDots[y][x], poleDots[y][x + 1]);
             poleDots[y][x].AddLine(line, poleDots[y][x + 1]);
             poleDots[y][x + 1].AddLine(line, poleDots[y][x]);
             poleLines.Add(line);
         }
         if (y < size - 1)
         {
             for (int x = 0; x < size; x++)
             {
                 PoleLine line = new PoleLine(poleDots[y][x], poleDots[y + 1][x]);
                 poleDots[y][x].AddLine(line, poleDots[y + 1][x]);
                 poleDots[y + 1][x].AddLine(line, poleDots[y][x]);
                 poleLines.Add(line);
             }
         }
     }
 }
Exemplo n.º 5
0
 public void SetFinish(int x, int y)
 {
     finish = poleDots[y][x];
 }
Exemplo n.º 6
0
 public void SetStart(int x, int y)
 {
     start = poleDots[y][x];
 }
Exemplo n.º 7
0
 public PoleEltPoint(PoleDot dot)
 {
     attachedDot = dot;
 }
Exemplo n.º 8
0
        public bool FindPath(PoleDot begin, PoleDot end, int[][] ways)
        {
            begin.isUsed = true;
            if (begin == end)
            {
                if (dotData.PathLength() < poleSize * 3)
                {
                    return(false);
                }
                //if (!eltsManager.CheckSolution())
                //{
                //    return false;
                //}
                return(true);
            }
            bool[] tries = { true, true, true, true };
            dotData.AddDot(begin);
            bool triesLeft = true;

            //for (int i = 0; i < poleSize; i++)
            //{
            //    for (int l = 0; l < poleSize; l++)
            //    {
            //        Console.Write(ways[i][l] + " ");
            //    }
            //    Console.WriteLine();
            //}
            //Console.WriteLine();
            while (triesLeft)
            {
                int k = myRandGen.GetRandom() % 4;
                while (!tries[k])
                {
                    k = myRandGen.GetRandom() % 4;
                }

                switch (k)
                {
                case 0:

                    if (begin.position_y > 0 && ways[begin.position_y - 1][begin.position_x] == 0 && tries[0])
                    {
                        ways[begin.position_y - 1][begin.position_x] = 1;
                        begin.up.isUsed = true;
                        if (FindPath(poleDots[begin.position_y - 1][begin.position_x], end, ways))
                        {
                            return(true);
                        }
                        else
                        {
                            ways[begin.position_y - 1][begin.position_x] = 0;
                            begin.up.isUsed = false;
                            tries[0]        = false;
                        }
                    }
                    else
                    {
                        tries[0] = false;
                    }
                    break;

                case 1:

                    if (begin.position_x < poleSize - 1 && ways[begin.position_y][begin.position_x + 1] == 0 && tries[1])
                    {
                        ways[begin.position_y][begin.position_x + 1] = 1;
                        begin.right.isUsed = true;
                        if (FindPath(poleDots[begin.position_y][begin.position_x + 1], end, ways))
                        {
                            return(true);
                        }
                        else
                        {
                            ways[begin.position_y][begin.position_x + 1] = 0;
                            begin.right.isUsed = false;
                            tries[1]           = false;
                        }
                    }
                    else
                    {
                        tries[1] = false;
                    }
                    break;

                case 2:

                    if (begin.position_y < poleSize - 1 && ways[begin.position_y + 1][begin.position_x] == 0 && tries[2])
                    {
                        ways[begin.position_y + 1][begin.position_x] = 1;
                        begin.down.isUsed = true;
                        if (FindPath(poleDots[begin.position_y + 1][begin.position_x], end, ways))
                        {
                            return(true);
                        }
                        else
                        {
                            ways[begin.position_y + 1][begin.position_x] = 0;
                            begin.down.isUsed = false;
                            tries[2]          = false;
                        }
                    }
                    else
                    {
                        tries[2] = false;
                    }
                    break;

                case 3:

                    if (begin.position_x > 0 && ways[begin.position_y][begin.position_x - 1] == 0 && tries[3])
                    {
                        ways[begin.position_y][begin.position_x - 1] = 1;
                        begin.left.isUsed = true;
                        if (FindPath(poleDots[begin.position_y][begin.position_x - 1], end, ways))
                        {
                            return(true);
                        }
                        else
                        {
                            ways[begin.position_y][begin.position_x - 1] = 0;
                            begin.left.isUsed = false;
                            tries[3]          = false;
                        }
                    }
                    else
                    {
                        tries[3] = false;
                    }
                    break;
                }
                if (!tries[0] && !tries[1] && !tries[2] && !tries[3])
                {
                    triesLeft = false;
                }
            }
            ways[begin.position_y][begin.position_x] = 0;
            begin.isUsed = false;
            dotData.GetDot();
            return(false);
        }
Exemplo n.º 9
0
 public PoleLine(PoleDot firstDot, PoleDot secondDot)
 {
     first  = firstDot;
     second = secondDot;
     isUsed = false;
 }