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

来源:互联网 发布:企查查软件下载 编辑:程序博客网 时间:2024/06/04 20:37

Page 57

Description

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


Sample Input

TRGSJXDOKIM VLNWPABEUQHCFARRBBL0ABCDEFGHIJKLMNOPQRSTUVWXAAALLLL0ABCDEFGHIJKLMNOPQRSTUVWXAAAAABBRRRLL0Z

Sample Output

Puzzle #1:T R G S JX O K L IM D V B NW P   A EU Q H C FPuzzle #2:  A B C DF G H I EK L M N JP Q R S OT U V W XPuzzle #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<iostream>#include<cstring>#include<cstdlib>#include<cstdio>using namespace std;#define max 105char 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;}
执行结果:

2 0
原创粉丝点击