思路:将字符存储在二维数组中,读取命令ABLR,最后输出结果。
用readchar来读取除换行和回车以外的字符
用变量ill(illeagal)来判断是否非法,
在读取命令的过程中,直接break掉非法操作导致tle
因为之后的RRLLAABB等命令不能读入
多次修改后结果为TLE,在break上面浪费了大量时间
#include <stdio.h>
#include <string.h>
char a[10][10];
int x, y;
void find(void)
{
int i, j;
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++)
if(a[i][j] == ' '){
x = i;
y = j;
return;
}
}
char readchar(void)
{
char ch;
for(;;){
ch = getchar();
if(ch != '\n' && ch != '\r')
return ch;
}
}
int main(void)
{
int kase = 0;
while(1){
int i, j;
a[0][0] = readchar();
if(a[0][0] == 'Z') break;
for(j = 1; j < 5; j++)
a[0][j] = readchar();
for(i = 1; i < 5; i++)
for(j = 0; j < 5; j++)
a[i][j] = readchar();
int ill = 0;
while(1){
char ch;
ch = readchar();
if(ch == '0') break;
if(ch == 'A'){
find();
if(x - 1 < 0){
ill = 1;
}
else{
a[x][y] = a[x - 1][y];
a[x - 1][y] = ' ';
}
}
else if(ch == 'B'){
find();
if(x + 1 >= 5){
ill = 1;
}
else{
a[x][y] = a[x + 1][y];
a[x + 1][y] = ' ';
}
}
else if(ch == 'L'){
find();
if(y - 1 < 0){
ill = 1;
}
else{
a[x][y] = a[x][y - 1];
a[x][y - 1] = ' ';
}
}
else if(ch == 'R'){
find();
if(y + 1 >= 5){
ill = 1;
}
else{
a[x][y] = a[x][y + 1];
a[x][y + 1] = ' ';
}
}
}
if(kase) printf("\n");
printf("Puzzle #%d:\n", ++kase);
if(!ill)
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++){
if(j == 0)
printf("%c", a[i][j]);
else
printf(" %c", a[i][j]);
}
printf("\n");
}
else if(ill)
printf("This puzzle has no final configuration.\n");
}
return 0;
}