这题比上一题还虐。
二十分钟把程序写出来,输入输出样例都实现了,用了一下午来查错。
在网上找了份标程,一点一点的替换功能,找到了错误出现的地点,但是没有想明白原因。
查错中一共提交了40多次,而UVa令人发指地慢,还好有华中科技大学virtual judge。(题号UVALive 5166)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define maxn 1000
int main () {
int T = 1,error=0,len;
bool line = false;
char m [5] [7],s[maxn];
while ( T ) {
int x;
int y;
memset(s,0,sizeof(s));
//读入网格
for(int i = 0; i <= 4; i++)
{
for(int j = 0; j <= 4; j++)
{
m[i][j] = getchar();
if(m[i][j]==' '){x=i;y=j;}
//if((j>1)&&(m[0][0] == 'Z')&&(!isalpha(m[0][1]))) break;
if((m[0][0] == 'Z')&&(!isalpha(m[0][1]))) break;
if((!isalpha(m[i][j]))&&(m[i][j]!=' ')&&(!isdigit(m[i][j]))) m[i][j] = getchar();
}
if((m[0][0] == 'Z')&&(!isalpha(m[0][1]))) break;
}
if((m[0][0] == 'Z')&&(!isalpha(m[0][1]))) break;
//跳过网格末尾换行符
getchar();
//读入网格结束
//寻找空格坐标 读入网格的时候已经确认过xy了,为何不能去掉此处?
for ( int i = 0; i < 5; i++ ) {
for ( int j = 0; j < 5; j++ ) {
if ( m [i] [j] == ' ' ) {
x = i;
y = j;
i = j = 5;
}
}
}
//寻找空格坐标结束
//读入并执行指令 正常
for(int i = 0; i < maxn; i++)
{
char temp;
temp = getchar();
if(temp == '0') break;
if(isalpha(temp)) s[i] = temp;
else i--;
}
//跳过命令末尾换行符
getchar();
//printf("%s\n",s);
len = strlen(s);
for(int i = 0; i < len; i++)
{
if(s[i] == 'A')
{
if(x==0){error=1;break;}
m[x][y]=m[x-1][y];
m[x-1][y]=' ';
x--;
}
else if(s[i] == 'B')
{
if(x==4){error=1;break;}
m[x][y]=m[x+1][y];
m[x+1][y]=' ';
x++;
}
else if(s[i] == 'L')
{
if(y==0){error=1;break;}
m[x][y]=m[x][y-1];
m[x][y-1]=' ';
y--;
}
else if(s[i] == 'R')
{
if(y==4){error=1;break;}
m[x][y]=m[x][y+1];
m[x][y+1]=' ';
y++;
}
else {error=1;break;}
}
//输出网格 问题 输出空行为何不能写入for循环内部?
if ( line )
printf ("\n");//如果注释本句用//n的语句替换掉它前面的语句把输出空行写入for循环则wa?
line = true;
if ( !error )
{
for(int i = 0; i <= 4; i++)
for(int j = 0; j <= 4; j++)
{
if((i+j) == 0) printf("Puzzle #%d:\n",T);
if(j !=4)printf("%c ",m[i][j]);
else if(i != 4)printf("%c\n",m[i][j]);
else printf("%c\n",m[i][j]);
//else {printf("%c\n\n",m[i][j]);}//n
}
}
else
printf("Puzzle #%d:\nThis puzzle has no final configuration.\n",T);
//printf("Puzzle #%d:\nThis puzzle has no final configuration.\n\n",T);//n
T++;
error = 0;
//输出结束
}
return 0;
}