import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); char[][] in = new char[5][5];//存储网格字符 char[] arr;//指令序列 //空格的位置 (blankPosX, blankPosY) int blankPosX = 0, blankPosY = 0, x, y; int puzzleCase = 0;//谜题的序号 boolean first = true;//用于判断是否为第一谜题答案的输出,如果是则不能输出换行,否则输出换行 while(input.hasNext()) { String str; //读取换行(为什么这样做的原因看下面注释) if(puzzleCase != 0) str = input.nextLine(); boolean ans = true; //初始化网格 str = input.nextLine(); if(str.equals("Z")) break; for(int i = 0; i < 5; i++) { in[0][i] = str.charAt(i); if(in[0][i] == ' ') { blankPosX = 0; blankPosY = i; } } for(int i = 1; i < 5; i++) { str = input.nextLine(); for(int j = 0; j < 5; j++) { in[i][j] = str.charAt(j); if(in[i][j] == ' ') { blankPosX = i; blankPosY = j; } } } //读取指令序列 boolean isEnd = false; String temp = ""; while(!isEnd) { //由于此处使用next()进行读取,当我们输入指令后进行换行时,换行符未被读取 //当重新开始新谜题的网格读取时,使用nextLine()方法,它将会读取换行 //这也是为什么在程序一开始要先用nextLine()方法读取一下的原因。 //当然第一个谜题时,我们并不需要读取换行。 temp = temp + input.next(); if(temp.charAt(temp.length() - 1) == '0') isEnd = true; } arr = temp.toCharArray();//将字符串指令转化为字符数组 for(int i = 0; i < arr.length; i++) { if(arr[i] == '0') break; //非法指令:数组越界。我们只要先判断当发生某种交换时是否将发生数组越界,就可以知道该指令是否非法 if(arr[i] == 'A') { if(blankPosX == 0) { ans = false; break; } else { swap(in, blankPosX, blankPosY, blankPosX - 1, blankPosY); blankPosX = blankPosX - 1; } } else if(arr[i] == 'B') { if(blankPosX == 4) { ans = false; break; } else { swap(in, blankPosX, blankPosY, blankPosX + 1, blankPosY); blankPosX = blankPosX + 1; } } else if(arr[i] == 'L') { if(blankPosY == 0) { ans = false; break; } else { swap(in, blankPosX, blankPosY, blankPosX, blankPosY - 1); blankPosY = blankPosY - 1; } } else if(arr[i] == 'R'){ if(blankPosY == 4) { ans = false; break; } else { swap(in, blankPosX, blankPosY, blankPosX, blankPosY + 1); blankPosY = blankPosY + 1; } } } if(first) first = false; else System.out.println(); System.out.println("Puzzle #" + (++puzzleCase) + ":"); if(ans == false) System.out.println("This puzzle has no final configuration."); else { for(int i = 0; i < 5; i++) { System.out.print(in[i][0]); for(int j = 1; j < 5; j++) System.out.print(" " + in[i][j]); System.out.println(); } } } } //交换字符的位置 public static void swap(char[][] arr, int x1, int y1, int x2, int y2) { char temp = arr[x1][y1]; arr[x1][y1] = arr[x2][y2]; arr[x2][y2] = temp; } } |
Double click to view unformatted code.