我的思路是先把鹘子每个数字向四个方向滚动后对应的数字列出来,保存在二维数组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])));
            }
        }

    }

}