View Code of Problem 1083

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.


Back to problem 1083