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


京公网安备 11010502036488号