private static bool isCollisionAffected(int[,] matrix, element targetElement)
        {
            UInt16 upElementCordinatesRow = (UInt16)(targetElement.Row - 1);
            UInt16 upElementCordinatesCol = targetElement.Col;
            UInt16 downElementCordinatesRow = (UInt16)(targetElement.Row + 1);
            UInt16 downElementCordinatesCol = targetElement.Col;
            UInt16 leftElementCordinatesRow = targetElement.Row;
            UInt16 leftElementCordinatesCol = (UInt16)(targetElement.Col - 1);
            UInt16 rightElementCordinatesRow = targetElement.Row;
            UInt16 rightElementCordinatesCol = (UInt16)(targetElement.Col + 1);

            if (matrix [targetElement.Row, targetElement.Col] == 0)
                return true;

            if (targetElement.Up)
                if (matrix [upElementCordinatesRow, upElementCordinatesCol] == 0)
                    return true;

            if (targetElement.Down)
                if (matrix [downElementCordinatesRow, downElementCordinatesCol] == 0)
                    return true;

            if (targetElement.Left)
                if (matrix [leftElementCordinatesRow, leftElementCordinatesCol] == 0)
                    return true;

            if (targetElement.Right)
                if (matrix [rightElementCordinatesRow, rightElementCordinatesCol] == 0)
                    return true;

            return false;
        }
        private static element ElementAfterTurn(int[,] matrix, UInt16 row, UInt16 col, int Moves)
        {
            element elementPack = new element ();
            elementPack.Row = row;
            elementPack.Col = col;
            elementPack.Cost = (UInt16)Math.Abs(Moves);
            elementPack.Value = CalculateSum (matrix);
            elementPack.isRased = (Moves > 0);
            matrix [1, 1] += Moves;

            bool killLastTouchedTower = false;

            UInt16 i = 1 , j = 1;

            if (matrix [i, j] == matrix [i + 1, j] && matrix[i,j] != 0)
            {
                matrix [i + 1, j] = 0;
                killLastTouchedTower = true;
                elementPack.Down = true;
            }
            if (matrix[i, j] == matrix[i - 1, j] && matrix[i,j] != 0)
            {
                matrix[i - 1, j] = 0;
                killLastTouchedTower = true;
                elementPack.Up = true;
            }
            if (matrix[i, j] == matrix[i, j - 1] && matrix[i,j] != 0)
            {
                matrix[i, j - 1] = 0;
                killLastTouchedTower = true;
                elementPack.Left = true;
            }
            if (matrix[i, j] == matrix[i, j + 1] && matrix[i,j] != 0)
            {
                matrix[i, j + 1] = 0;
                killLastTouchedTower = true;
                elementPack.Right = true;
            }

            if (killLastTouchedTower == true)
                matrix[i, j] = 0;

            elementPack.Value -= CalculateSum(matrix);
            elementPack.ValueCoefficient = elementPack.Value/elementPack.Cost;

            return elementPack;
        }
        private static void ExecuteTurn(int[,] matrix, element targetElement)
        {
            UInt16 upElementCordinatesRow = (UInt16)(targetElement.Row - 1);
            UInt16 upElementCordinatesCol = (UInt16)targetElement.Col;
            UInt16 downElementCordinatesRow = (UInt16)(targetElement.Row + 1);
            UInt16 downElementCordinatesCol = (UInt16)targetElement.Col;
            UInt16 leftElementCordinatesRow = (UInt16)targetElement.Row;
            UInt16 leftElementCordinatesCol = (UInt16)(targetElement.Col - 1);
            UInt16 rightElementCordinatesRow = (UInt16)targetElement.Row;
            UInt16 rightElementCordinatesCol = (UInt16)(targetElement.Col + 1);

            if (targetElement.Up == true)
                matrix [upElementCordinatesRow, upElementCordinatesCol] = 0;

            if (targetElement.Down == true)
                matrix [downElementCordinatesRow, downElementCordinatesCol] = 0;

            if (targetElement.Left == true)
                matrix [leftElementCordinatesRow, leftElementCordinatesCol] = 0;

            if (targetElement.Right == true)
                matrix [rightElementCordinatesRow, rightElementCordinatesCol] = 0;

            matrix[targetElement.Row, targetElement.Col] = 0;
        }
        public static element[] ResultInMatrixForTurnsAtLocation(int[,] matrix, UInt16 turnsCount, UInt16 row, UInt16 col)
        {
            element rasePack = new element();
            element dropPack = new element();

            int midValue = matrix[1, 1];

            int leftSum = matrix[1, 0] - midValue;
            int rightSum = matrix[1, 2] - midValue;
            int upSum = matrix[0, 1] - midValue;
            int downSum = matrix[2, 1] - midValue;

            int[] localValues = new int []
            {
                rightSum,
                upSum,
                leftSum,
                downSum
            };

            int upValue = 0, downValue = 0;
            foreach (var el in localValues)
            {
                if (Math.Abs(el) > turns)
                    continue;

                if( el < 0 )
                {
                    if (Math.Abs(el) < downValue || downValue == 0)
                        downValue = Math.Abs(el);
                }
                else
                {
                    if (el < upValue || upValue == 0)
                        upValue = el;
                }
            }

            if(upValue != 0)
            {
                int [,] rasedMatrix = new int [3,3];
                Array.Copy(matrix, rasedMatrix, matrix.Length);

                rasePack = ElementAfterTurn(rasedMatrix, row, col, upValue);
            }

            if(downValue != 0)
            {
                int [,] dropMatrix = new int [3,3];
                Array.Copy(matrix, dropMatrix, matrix.Length);

                dropPack = ElementAfterTurn(dropMatrix, row, col, -downValue);
            }

            element[] result = new element [2];
            result[0] = rasePack;
            result[1] = dropPack;

            return result;
        }