题解 | #附加题#

附加题

https://www.nowcoder.com/practice/9bbc4115e48b45239d6dcd2bf45f6926

import java.util.Scanner;

public class Main {
    private static int max = 0;
    private static int[] nums = new int[24];

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            solution(in);
        }
    }

    /**
     * 模拟法: 3轴旋转(xyz)
     * @param in
     */
    private static void solution(Scanner in){
        max = 0;
        nums = new int[24];

        for(int i=0; i<24; i++){
            nums[i] = in.nextInt();
        }

        // init magic cube
        int[][] matrix = new int[9][7];
        matrix[1][3] = 0;
        matrix[1][4] = 1;

        matrix[2][3] = 2;
        matrix[2][4] = 3;

        matrix[3][1] = 4;
        matrix[3][2] = 5;
        matrix[3][3] = 6;
        matrix[3][4] = 7;
        matrix[3][5] = 8;
        matrix[3][6] = 9;

        matrix[4][1] = 10;
        matrix[4][2] = 11;
        matrix[4][3] = 12;
        matrix[4][4] = 13;
        matrix[4][5] = 14;
        matrix[4][6] = 15;

        matrix[5][3] = 16;
        matrix[5][4] = 17;

        matrix[6][3] = 18;
        matrix[6][4] = 19;

        matrix[7][3] = 20;
        matrix[7][4] = 21;

        matrix[8][3] = 22;
        matrix[8][4] = 23;

        operate(0, matrix);

        System.out.println(max);
    }

    /**
     * 递归
     * @param opTimes
     * @param matrix
     */
    private static void operate(int opTimes, int[][] matrix){
        if(opTimes <= 5){
            max = Math.max(max, beauty(matrix));
        }else{
            return;
        }

        // 1-xy平面(绕z轴旋转) 2-yz平面(绕x轴旋转) 3-xz平面(绕y轴旋转)
        for(int i=1; i<=3; i++){
            // 1-左右旋转(xy平面,绕z轴旋转)
            if(i == 1){
                // 0-向左旋转 1-向右旋转
                for(int j=0; j<=1; j++){
                    rotate(i, j, matrix);
                    operate(opTimes+1, matrix);
                    rotate(i, (j+1)%2, matrix);
                }
            }

            // 2-上下旋转(yz平面,绕x轴旋转)
            if(i == 2){
                // 0-向上旋转 1-向下旋转
                for(int j=0; j<=1; j++){
                    rotate(i, j, matrix);
                    operate(opTimes+1, matrix);
                    rotate(i, (j+1)%2, matrix);
                }
            }

            // 3-顺逆旋转(xz平面,绕y轴旋转)
            if(i == 3){
                // 0-顺时针旋转 1-逆时针旋转
                for(int j=0; j<=1; j++){
                    rotate(i, j, matrix);
                    operate(opTimes+1, matrix);
                    rotate(i, (j+1)%2, matrix);
                }
            }
        }
    }

    /**
     * 旋转: 以序号6 7 12 13所在平面为基准
     * @param i
     * @param j
     * @param matrix
     */
    private static void rotate(int i, int j, int[][] matrix){
        // 1-左右旋转(xy平面,绕z轴旋转)
        if(i == 1){
            zRotate(j, matrix);
        }

        // 2-上下旋转(yz平面,绕x轴旋转)
        if(i == 2){
            xRotate(j, matrix);
        }

        // 3-顺逆旋转(xz平面,绕y轴旋转)
        if(i == 3){
            yRotate(j, matrix);
        }
    }

    /**
     * 上下旋转(yz平面,绕x轴旋转)
     * 左列向上旋转 等价于 右列向下旋转, 右列可不管
     * @param j
     * @param matrix
     */
    private static void xRotate(int j, int[][] matrix){
        // 左列(序号6 12所在yz平面) 向上旋转
        if(j == 0){
            int tmp1 = matrix[1][3];
            int tmp2 = matrix[2][3];

            matrix[1][3] = matrix[3][3];
            matrix[2][3] = matrix[4][3];

            matrix[3][3] = matrix[5][3];
            matrix[4][3] = matrix[6][3];

            matrix[5][3] = matrix[7][3];
            matrix[6][3] = matrix[8][3];

            matrix[7][3] = tmp1;
            matrix[8][3] = tmp2;

            // 面(序号4 5 10 11平面) 旋转
            int tmp3 = matrix[3][1];
            matrix[3][1] = matrix[3][2];
            matrix[3][2] = matrix[4][2];
            matrix[4][2] = matrix[4][1];
            matrix[4][1] = tmp3;
        }

        // 左列(序号6 12所在yz平面) 向下旋转
        if(j == 1){
            int tmp1 = matrix[8][3];
            int tmp2 = matrix[7][3];

            matrix[8][3] = matrix[6][3];
            matrix[7][3] = matrix[5][3];

            matrix[6][3] = matrix[4][3];
            matrix[5][3] = matrix[3][3];

            matrix[4][3] = matrix[2][3];
            matrix[3][3] = matrix[1][3];

            matrix[2][3] = tmp1;
            matrix[1][3] = tmp2;

            // 面(序号4 5 10 11平面) 旋转
            int tmp3 = matrix[3][1];
            matrix[3][1] = matrix[4][1];
            matrix[4][1] = matrix[4][2];
            matrix[4][2] = matrix[3][2];
            matrix[3][2] = tmp3;
        }
    }

    /**
     * 顺逆旋转(xz平面,绕y轴旋转)
     * @param j
     * @param matrix
     */
    private static void yRotate(int j, int[][] matrix){
        // (序号6 7 12 13所在xz平面) 顺时针旋转
        if(j == 0){
            int tmp1 = matrix[2][3];
            int tmp2 = matrix[2][4];

            matrix[2][3] = matrix[4][2];
            matrix[2][4] = matrix[3][2];

            matrix[4][2] = matrix[5][4];
            matrix[3][2] = matrix[5][3];

            matrix[5][4] = matrix[3][5];
            matrix[5][3] = matrix[4][5];

            matrix[3][5] = tmp1;
            matrix[4][5] = tmp2;

            // 面 旋转
            int tmp3 = matrix[3][3];
            matrix[3][3] = matrix[4][3];
            matrix[4][3] = matrix[4][4];
            matrix[4][4] = matrix[3][4];
            matrix[3][4] = tmp3;
        }

        // (序号6 7 12 13所在xz平面) 逆时针旋转
        if(j == 1){
            int tmp1 = matrix[2][3];
            int tmp2 = matrix[2][4];

            matrix[2][3] = matrix[3][5];
            matrix[2][4] = matrix[4][5];

            matrix[3][5] = matrix[5][4];
            matrix[4][5] = matrix[5][3];

            matrix[5][4] = matrix[4][2];
            matrix[5][3] = matrix[3][2];

            matrix[4][2] = tmp1;
            matrix[3][2] = tmp2;

            // 面 旋转
            int tmp3 = matrix[3][3];
            matrix[3][3] = matrix[3][4];
            matrix[3][4] = matrix[4][4];
            matrix[4][4] = matrix[4][3];
            matrix[4][3] = tmp3;
        }
    }

    /**
     * 左右旋转(xy平面,绕z轴旋转)
     * 上行向左旋转 等价于 下行向右旋转, 下行可不管
     * @param j
     * @param matrix
     */
    private static void zRotate(int j, int[][] matrix){
        // 上行(序号6 7所在xy平面) 向左旋转
        if(j == 0){
            // 行 旋转
            int tmp1 = matrix[3][1];
            int tmp2 = matrix[3][2];

            matrix[3][1] = matrix[3][3];
            matrix[3][2] = matrix[3][4];

            matrix[3][3] = matrix[3][5];
            matrix[3][4] = matrix[3][6];

            matrix[3][5] = matrix[8][4];
            matrix[3][6] = matrix[8][3];

            matrix[8][4] = tmp1;
            matrix[8][3] = tmp2;

            // 面(序号0 1 2 3平面) 旋转
            int tmp3 = matrix[1][3];
            matrix[1][3] = matrix[2][3];
            matrix[2][3] = matrix[2][4];
            matrix[2][4] = matrix[1][4];
            matrix[1][4] = tmp3;
        }

        // 上行(序号6 7所在xy平面) 向右旋转
        if(j == 1){
            int tmp1 = matrix[3][6];
            int tmp2 = matrix[3][5];

            matrix[3][6] = matrix[3][4];
            matrix[3][5] = matrix[3][3];

            matrix[3][4] = matrix[3][2];
            matrix[3][3] = matrix[3][1];

            matrix[3][2] = matrix[8][3];
            matrix[3][1] = matrix[8][4];

            matrix[8][3] = tmp1;
            matrix[8][4] = tmp2;

            // 面(序号0 1 2 3平面) 旋转
            int tmp3 = matrix[1][3];
            matrix[1][3] = matrix[1][4];
            matrix[1][4] = matrix[2][4];
            matrix[2][4] = matrix[2][3];
            matrix[2][3] = tmp3;
        }
    }

    private static int beauty(int[][] matrix){
        int beauty1 = nums[matrix[1][3]] * nums[matrix[1][4]] * nums[matrix[2][3]] * nums[matrix[2][4]];
        int beauty2 = nums[matrix[3][1]] * nums[matrix[3][2]] * nums[matrix[4][1]] * nums[matrix[4][2]];
        int beauty3 = nums[matrix[3][3]] * nums[matrix[3][4]] * nums[matrix[4][3]] * nums[matrix[4][4]];
        int beauty4 = nums[matrix[3][5]] * nums[matrix[3][6]] * nums[matrix[4][5]] * nums[matrix[4][6]];
        int beauty5 = nums[matrix[5][3]] * nums[matrix[5][4]] * nums[matrix[6][3]] * nums[matrix[6][4]];
        int beauty6 = nums[matrix[7][3]] * nums[matrix[7][4]] * nums[matrix[8][3]] * nums[matrix[8][4]];

        return beauty1+beauty2+beauty3+beauty4+beauty5+beauty6;
    }
}

全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 20:12
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务