有一个5 * 5的网络,其中恰好有一个格子是空的,其他格子各有一个字母。
- 一共有4种指令:A, B, L, R, 分别表示把空格上、下、左、右的相邻字母移到空格中。
- 输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网络。
- 如果有非法指令,应输出" This puzzle has no final configuration."。
如:
T R G S J
X D O K I
M V L N
W P A B E
U Q H C F
执行序列: ARRBBL0
输出:
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
- 新建一个5 行 x 5 列的二维数组
- 找到当前空格子的坐标(X,Y)
- 在 5 x 5 网格的四个边界内移动格子 : 上-1 >=0 , 下+1 <=4 , 左-1 >= 0 , 右+1 <= 4 ;
- 分解执行序列 A -->R–> R–> B–> B–> L–> 0
import java.util.Scanner;
public class MathTestMain {
public static void main(String[] args) {
// 空格子的坐标
int x = 0;
int y = 0;
boolean flag = true;
String[][] cs = { { "T", "R", "G", "S", "J" }, { "X", "D", "O", "K", "I" }, { "M", " ", "V", "L", "N" },
{ "W", "P", "A", "B", "E" }, { "U", "Q", "H", "C", "F" } };
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
// 遍历抽取移动的路径
for (int i = 0; i < str.length(); i++) {
// 搜索当前空格子所在的位置
for (int k = 0; k < 5; k++) {
for (int j = 0; j < 5; j++) {
// 找到后
if (cs[k][j].equals(" ")) {
x = k;
y = j;
// 输出坐标
System.out.println("当前坐标: (" + x + "," + y + ")");
}
}
}
// 移动格子
switch (str.charAt(i)) {
case 'A':
//上边界
if (x - 1 >= 0) {
cs[x][y] = cs[x - 1][y];
cs[x - 1][y] = " ";
// 测试
for (int j = 0; j < cs.length; j++) {
for (int j2 = 0; j2 < cs.length; j2++) {
System.out.printf("%" + 5 + "s", cs[j][j2]);
}
System.out.println();
}
System.out.println("****************************");
} else {
flag = false;
}
break;
case 'B':
//下边界
if (x + 1 <= 4) {
cs[x][y] = cs[x + 1][y];
cs[x + 1][y] = " ";
// 测试
for (int j = 0; j < cs.length; j++) {
for (int j2 = 0; j2 < cs.length; j2++) {
System.out.printf("%" + 5 + "s", cs[j][j2]);
}
System.out.println("");
}
System.out.println("****************************");
} else {
flag = false;
}
break;
case 'L':
//左边界
if (y - 1 >= 0) {
cs[x][y] = cs[x][y - 1];
cs[x][y - 1] = " ";
// 测试
for (int j = 0; j < cs.length; j++) {
for (int j2 = 0; j2 < cs.length; j2++) {
System.out.printf("%" + 5 + "s", cs[j][j2]);
}
System.out.println();
}
System.out.println("****************************");
} else {
flag = false;
}
break;
case 'R':
//右边界
if (y + 1 <= 4) {
cs[x][y] = cs[x][y + 1];
cs[x][y + 1] = " ";
// 测试
for (int j = 0; j < cs.length; j++) {
for (int j2 = 0; j2 < cs.length; j2++) {
System.out.printf("%" + 5 + "s", cs[j][j2]);
}
System.out.println();
}
System.out.println("****************************");
} else {
flag = false;
}
break;
case '0':
break;
default:
System.out.println("This puzzle has no final configuration");
break;
}
}
//在 5 x 5 的范围内执行后的结果
if (flag) {
for (int j = 0; j < cs.length; j++) {
for (int j2 = 0; j2 < cs.length; j2++) {
System.out.printf("%" + 5 + "s", cs[j][j2]);
}
System.out.println();
}
}
}
}