//本题TLE的原因:应该以Z终止,而不是以EOF终止
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define maxn 5
int move(char board[][maxn], char code[])
{
int len_code = strlen(code), i, j;
for (i = 0; i < len_code; i ++){ //在此多加判断:是否密码存在非法字符
if (code[i]!='A' && code[i]!='B' && code[i]!='L' && code[i]!='R'){
return 0;
}
}
int x, y; //定义空格的坐标
for (i = 0; i < 5; i ++){
for (j = 0; j < 5; j ++){
if (board[i][j] == ' '){
x = i; y = j;
}
}
}
for (i = 0; i < len_code; i ++){
if (code[i] == 'A'){
if (x - 1 < 0) return 0;
else {
board[x][y] = board[x - 1][y]; x --; board[x][y] = ' ';
}
continue;
}
if (code[i] == 'B'){
if (x + 1 >= 5) return 0;
else {
board[x][y] = board[x + 1][y]; x ++; board[x][y] = ' ';
}
continue;
}
if (code[i] == 'L'){
if (y - 1 < 0) return 0;
else {
board[x][y] = board[x][y - 1]; y --; board[x][y] = ' ';
}
continue;
}
if (code[i] == 'R'){
if (y + 1 >= 5) return 0;
else {
board[x][y] = board[x][y + 1]; y ++; board[x][y] = ' ';
}
continue;
}
}
return 1;
}
int main()
{
char board[maxn][maxn];
int cases = 0;
while (scanf("%c", &board[0][0])!= EOF){
if (board[0][0] == 'Z')
break;
int i, j;
for (i = 0; i < 5; i ++){
int flag = 0; //是否出现行尾空格直接换行符
for (j = 0; j < 5; j ++){
if (i==0 && j==0)
continue;
scanf("%c", &board[i][j]);
if (j==4 && board[i][j]=='\n'){
flag = 1;
board[i][j] = ' ';
}
}
if (!flag)
getchar(); //吃掉换行回车
}
char code[1001];
char codeii;
i = 0;
while (codeii = getchar()){
if (codeii == '0'){
code[i] = 0;
break;
}
if (isalpha(codeii) || isdigit(codeii)){
code[i] = codeii;
i ++;
}
}
getchar(); //吃掉输入完毕的换行符
printf("%s\n======\n", code);
if (cases ++)
printf("\n");
printf("Puzzle #%d:\n", cases);
if (move(board, code)){ //如果没有非法命令返回
for (i = 0; i < 5; i ++){
for (j = 0; j < 4; j ++)
printf("%c ", board[i][j]);
printf("%c\n", board[i][j]);
}
}
else
printf("This puzzle has no final configuration.\n");
}
return 0;
}
/*
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
这是题目给出的输入样例
S后面不是空格,是否需要考虑行尾空格直接输入换行的情况
以增强程序的鲁棒性
*/
UVa227 Puzzle
最新推荐文章于 2022-10-02 01:41:04 发布