OJ系列-UVA227(Puzzle)java版

签到,今天是连续OJ系列的第11天。
Puzzle, ACM/ICPC World Finals 1993,决赛的题就这个难度?还是说在那个年代的情况下。客观来说这个题不算太难,但又有点烦,烦的是还是输出,一度让我崩溃,具体的代码在晚上的时候已经写好了,提交的时候报了演示错误,我以为问题应该出在最后的组数据不用再回车了,但出于时间关系,没有改,而是放到了第二天来改。

题目

有一个5*5的网格, 其中恰好有一个格子是空的, 其他格子各有一个字母。 一共有4种指令: A, B, L, R, 分别表示把空格上、 下、 左、 右的相邻字母移到空格中。 输入初始网格和指令序列( 以数字0结束) , 输出指令执行完毕后的网格。 如果有非法指令, 应输出“Thispuzzle has no final configuration.”, 例如, 图3-5中执行ARRBBL0后, 效果如图
执行前

样例输入

TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z

读到Z的时候退出程序

样例输出

Puzzle #1:
T R G S J
X O K L I
M D V B N
W P   A E
U Q H C F

Puzzle #2:
  A B C D
F G H I E
K L M N J
P Q R S O
T U V W X

Puzzle #3:
This puzzle has no final configuration.

代码

import java.io.IOException;
import java.util.Scanner;

public class Uva227 {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		char [][]matrix=new char[5][5];
		Scanner scanner=new Scanner(System.in);
		int kase=0;
		while(scanner.hasNextLine()){
			boolean flag=true;
			for(int i=0;i<5;i++){
				String str=scanner.nextLine();
				if(str.length()==1&&str.charAt(0)=='Z'){//退出程序
					return;
				}
				if(flag&&kase!=0){//输出空行,第一个案例不输出空行
					System.out.println();
					flag=false;
				}
				if(str.length()==4){//如果空格在字符串的末尾将不会读进去,所以手动加上空格
					str=str+" ";
				}
				for(int j=0;j<5;j++){
					matrix[i][j]=str.charAt(j);//将字符串读到数组中
				}
			}
			System.out.printf("Puzzle #%d:\n",(++kase));
			String s=new String();
			String ch=new String();
			while(true){//读指令
				s=scanner.nextLine();
				ch+=s;//如果指令是由两行构成的,就加在一起
				if(s.charAt(s.length()-1)=='0'){//读到0则说明指令完了
					break;
				}
				
				
				
			}
			int c1=-1;//空白的横坐标
			int c2=-1;//空白的竖坐标
			for(int i=0;i<5;i++){//遍历寻找空白
				for(int j=0;j<5;j++){
					if(matrix[i][j]==' '){//找到空白
						c1=i;
						c2=j;
						break;//避免继续循环下去浪费时间
					}
				}
				if(c1!=-1){
					break;//不等于初始值即说明已经找到,避免继续循环下去浪费时间
				}
			}
			char []temp=ch.toCharArray();//将指令字符串转成字符数组
			char T;//中间变量
			boolean isPrint=true;
			for(int i=0;i<temp.length-1;i++){//temp数组中最后一位是0,来源于 s,不要这个零,遍历指令字符数组,得到指令
				if(temp[i]=='A'){
					if(c1-1<0){//如果指令不合法
						System.out.println("This puzzle has no final configuration.");
						isPrint=false;
						break;
					}else{//替换空白
					T=matrix[c1-1][c2];
					matrix[c1-1][c2]=' ';
					matrix[c1][c2]=T;
					c1=c1-1;
					}
				}else if(temp[i]=='B'){
					if(c1+1>4){
						System.out.println("This puzzle has no final configuration.");
						isPrint=false;
						break;
					}else{
					T=matrix[c1+1][c2];
					matrix[c1+1][c2]=' ';
					matrix[c1][c2]=T;
					c1=c1+1;
					}
				}else if(temp[i]=='L'){
					if(c2-1<0){
						System.out.println("This puzzle has no final configuration.");
						isPrint=false;
						break;
					}else{
					T=matrix[c1][c2-1];
					matrix[c1][c2-1]=' ';
					matrix[c1][c2]=T;
					c2=c2-1;
					}
				}else {//如果是R
					if(c2+1>4){
						System.out.println("This puzzle has no final configuration.");
						isPrint=false;
						break;
					}else{
					T=matrix[c1][c2+1];
					matrix[c1][c2+1]=' ';
					matrix[c1][c2]=T;
					c2=c2+1;
					}
				}
			}
		if(isPrint){//正常情况得到改变后的二维数组
			for(int i=0;i<5;i++){
				for(int j=0;j<5;j++){
					if(j<4){
				System.out.print((matrix[i][j])+" ");
					}else{//最后一位不用在输出空格
						System.out.print((matrix[i][j]));
					}
					
				}
				System.out.println();
				}
		}
		
		}
	}

}

主要的细节是输入输出,各种输入要求我一开始就解决得很好,还是输出上的问题比较大,提交报演示错误,演示错误的原因是:虽然程序貌似输出了正确的结果,但是这个结果的格式有点问题。请检查程序的输出是否多了或者少了空格 (’ ‘)、制表符(’\t’)或者换行符(’\n’),改的这个过程是接近崩溃的,因为不知道是哪里的输出出了问题,尝试了很多次,我一直以为是多了换行,没想到是少了换行,终于功夫不负有心人,在接近崩溃的边缘成功AC。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值