签到,今天是连续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。