我用递归做了阿里笔试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]))); } } } }