算法竞赛入门经典(第二版) 习题3-5 谜题(Puzzle) UVa227 Finals1993

Page 57

Description

一个5*5的网格中恰好有一个格子是空的,其他格子各有一个字母,四条指令A,B,L,R分别表示将空格上、下、左、右移动。输入初始网格(以Z结束)和一串指令(以0结束),输出执行操作后的网格。越界则输出“This puzzle has no final configuration.”。

 

Sample Input

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

 

 

Sample Output

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.

 
Note
不得不承认final的题就是不一样Orz,就算不难,半小时写好框架却花了一下午时间找bug,修改了N次后还是WA,我想到有可能是PE只是评测系统返回WA。
Separate output from different puzzle records by one blank line.
这句话就是罪魁祸首,其实它的意思是将输出和puzzle用一行隔开,然而我以为应该是这样输出的:

 
尼玛以前不都是这么输出的么!!Too young too simple...(PS这种输出格式实在找不到一种判断方法让最后不输出空行)
后来想了想,换了一种输出格式:

 
这样应该对了吧?又WA了!其实想想也应该是错的,因为它重定向后其实等于这样输出:

 
看到没?第一个输出前面不应该有空行。所以只要第一个不输出空行就可以AC啦。BTW,这样的输出格式有个好处,就是解决了这种输入格式怎么防止最后一个输出空行的问题~不愧是finals题 Orz
这题主要还是细节问题,比如如果puzzle的空格在一行中的最后,那么输出其实输到第4个就不用输了,所以第5个元素a[i][4]相当于'\0',此时要把它换成空格才好处理。另外由于输入中有空格,所以要用gets()。

 

 
#include 
#include 
#include 
#include 
using namespace std; 
#define max 105 
char s[max],ss[max]; 
char a[10][10],t; 
int main(){ 
    //freopen("in.txt","r",stdin); 
    int i,j,l,m,n,cas=0; 
    loop: 
    while(gets(a[0])){ 
    //while(gets()) 
        if(a[0][0]=='Z') break; 
        for(i=1;i<5;i++) 
            gets(a[i]); 
        for(i=0;i<5;i++){ 
            if(a[i][4]==0) {
                a[i][4]=' ';m=i;n=4;break;
            } 
            for(j=0;j<5;j++) 
                if(a[i][j]==' ') {
                    m=i;n=j;break;
                } 
        } 
        gets(s); 
        l=strlen(s); 
        while(s[l-1]!='0'){ //保证指令可以分行输入 
            gets(ss); 
            strcat(s,ss); 
            l=strlen(s); 
        } 
        if(cas!=0) 
        putchar(10); 
        i=0; 
        while(s[i]!='0'){ 
            switch (s[i]){ 
                case 'A':{ 
                    if(m-1>=0) {
                        t=a[m][n];a[m][n]=a[m-1][n];a[m-1][n]=t;m--;
                    } else {
                        printf("Puzzle #%d:\nThis puzzle has no final configuration.\n",++cas);
                        goto loop;
                    } 
                    break; 
                } 
                case 'B':{ 
                    if(m+1<5) {
                        t=a[m][n];a[m][n]=a[m+1][n];a[m+1][n]=t;m++;
                    } else {
                        printf("Puzzle #%d:\nThis puzzle has no final configuration.\n",++cas);
                        goto loop;
                    } 
                    break; 
                } 
                case 'L':{ 
                    if(n-1>=0) {
                        t=a[m][n];a[m][n]=a[m][n-1];a[m][n-1]=t;n--;
                    } else {
                        printf("Puzzle #%d:\nThis puzzle has no final configuration.\n",++cas);
                        goto loop;
                    } 
                    break; 
                } 
                case 'R':{ 
                    if(n+1<5) {
                        t=a[m][n];a[m][n]=a[m][n+1];a[m][n+1]=t;n++;
                    } else {
                        printf("Puzzle #%d:\nThis puzzle has no final configuration.\n",++cas);
                        goto loop;
                    } 
                    break; 
                } 
            } 
            i++; 
        } 
        printf("Puzzle #%d:\n",++cas); 
        for(i=0; i<5; i++) 
            printf("%c %c %c %c %c\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4]); 
    } 
    return 0; 
}

执行结果: 

算法竞赛入门经典(第二版) 习题3-5 谜题(Puzzle) UVa227 Finals1993_第1张图片

 

你可能感兴趣的:(基础题,字符串)