我用递归做了阿里笔试4.27第一题(线下补做的,只知道能通过测试数据)

我的思路是先把鹘子每个数字向四个方向滚动后对应的数字列出来,保存在二维数组roll中。roll的第一维的下标表示鹘子底面的数字,第二维表示向左、下、右、上四个方向翻滚对应的数字。
接着递归去跑,递归出口就是遇到E。

只有测试数据,结果是能跑出来,就是不知道能不能通过系统后台的验证,请指正

public class Main01 {

    // roll的第一维的下标表示鹘子底面的数字
    // 第二维表示向左、下、右、上四个方向翻滚对应的数字
    static char[][] roll = {
        {'2', '3', '5', '4'},   // 当鹘子底面是1时,向左翻滚为2,以此类推
        {'6', '3', '1', '4'},
        {'5', '1', '2', '6'},
        {'5', '6', '2', '1'},
        {'1', '3', '6', '4'},
        {'5', '3', '2', '4'}
    };

    static int T = 0;   // 测试用例的组数
    static int n = 0;   // 测试用例的维度

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

        T = in.nextInt();
        n = in.nextInt();

        char[][] chars = new char[n][n];
        for(int i=-1; i<n; i++){
            String str = in.nextLine();
            char[] charArray = str.toCharArray();
            for(int j=0; j<charArray.length; j++){
                chars[i][j] = charArray[j];
            }

        }

        for(int i=0; i<chars.length; i++){
            for (int j = 0; j < chars[i].length; j++) {
                if(("S").equals(chars[i][j]+"")){
                    f(chars, i, j, 6);
                    i = chars.length;
                    break;
                }
            }
        }

        for (int i = 0; i < chars.length; i++) {
            for (int j = 0; j < chars[i].length; j++) {
                System.out.print(chars[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 每到一个#,判断它向上下左右四个方向是否有相同的#,题目说了,保证路径唯一
     * (笔试时一直在考虑如果某个#的四个方向中出现两个以上能走怎么办,想来路径唯一的话,应该不会吧)
     * @param chars 测试用例的二维数组
     * @param x 行
     * @param y 列
     */
    public static void f(char[][] chars, int x, int y, int k){
        if(("E").equals(chars[x][y]+"")){
            return;
        }

        // 向左
        if(y != 0){
            if(("#").equals(chars[x][y-1]+"")){
                chars[x][y-1] = roll[k-1][0];
                f(chars, x, y-1, Integer.parseInt(String.valueOf(roll[k-1][0])));
            }
        }
        // 向下
        if(x != n-1){
            if(("#").equals(chars[x+1][y]+"")){
                chars[x+1][y] = roll[k-1][1];
                f(chars, x+1, y, Integer.parseInt(String .valueOf(roll[k-1][1])));
            }
        }
        // 向右
        if(y != n-1){
            if(("#").equals(chars[x][y+1]+"")){
                chars[x][y+1] = roll[k-1][2];
                f(chars, x, y+1, Integer.parseInt(String.valueOf(roll[k-1][2])));
            }
        }
        // 向上
        if(x != 0){
            if(("#").equals(chars[x-1][y]+"")){
                chars[x-1][y] = roll[k-1][3];
                f(chars, x-1, y, Integer.parseInt(String .valueOf(roll[k-1][3])));
            }
        }

    }

}
全部评论
我是做了一个状态转移,比如向右反转,右面就会变成底面,上面会变成右面,以此类推,过了
点赞 回复 分享
发布于 2020-04-28 13:19

相关推荐

醉蟀:你不干有的是人干
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司9个岗位
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

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