Ejemplo n.º 1
0
        private static void FindPlaceForCentralInCube(Part part, int i, string initColors, int[, ,] cube,
            int[] sortedW, int[] sortedD, int[] sortedH)
        {
            var xCount = cube.GetLength(0);
            var yCount = cube.GetLength(1);
            var zCount = cube.GetLength(2);

            var colPos = 0;
            while (part.Colors[colPos] == '.')
                colPos++;
            var colorFaceNum = initColors.IndexOf(part.Colors[colPos]);
            // front or back
            if (colorFaceNum == 0 || colorFaceNum == 1)
            {
                var startCubeX = colorFaceNum == 0 ? 0 : xCount - 1;
                var startCubeY = BinarySearch(part.D, sortedD) + 1;
                var startCubeZ = BinarySearch(part.H, sortedH) + 1;

                if (startCubeY == 0 || startCubeZ == 0
                    || !CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.D, part.H, sortedD, sortedH))
                {
                    part.RotateX();
                    var tmp = part.D;
                    part.D = part.H;
                    part.H = tmp;

                    startCubeY = BinarySearch(part.D, sortedD) + 1;
                    startCubeZ = BinarySearch(part.H, sortedH) + 1;
                    CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.D, part.H, sortedD, sortedH);
                }
            }
            if (colorFaceNum == 2 || colorFaceNum == 3)
            {
                var startCubeX = BinarySearch(part.W, sortedW) + 1;
                var startCubeY = colorFaceNum == 0 ? 0 : yCount - 1;
                var startCubeZ = BinarySearch(part.H, sortedH) + 1;

                if (startCubeX == 0 || startCubeZ == 0
                    || !CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.W, part.H, sortedW, sortedH))
                {
                    part.RotateY();
                    var tmp = part.W;
                    part.W = part.H;
                    part.H = tmp;

                    startCubeX = BinarySearch(part.W, sortedW) + 1;
                    startCubeZ = BinarySearch(part.H, sortedH) + 1;
                    CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.W, part.H, sortedW, sortedH);
                }
            }
            if (colorFaceNum == 4 || colorFaceNum == 5)
            {
                var startCubeX = BinarySearch(part.W, sortedW) + 1;
                var startCubeY = BinarySearch(part.D, sortedD) + 1;
                var startCubeZ = colorFaceNum == 0 ? 0 : zCount - 1;

                if (startCubeX == 0 || startCubeY == 0
                    || !CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.W, part.D, sortedW, sortedD))
                {
                    part.RotateZ();
                    var tmp = part.W;
                    part.W = part.D;
                    part.D = tmp;

                    startCubeX = BinarySearch(part.W, sortedW) + 1;
                    startCubeY = BinarySearch(part.D, sortedD) + 1;
                    CanFindPlaceForCentralInCube(cube, startCubeX, startCubeY, startCubeZ, i, part.W, part.D, sortedW, sortedD);
                }
            }
        }