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

这题比上一题还虐。

二十分钟把程序写出来,输入输出样例都实现了,用了一下午来查错。

在网上找了份标程,一点一点的替换功能,找到了错误出现的地点,但是没有想明白原因。

查错中一共提交了40多次,而UVa令人发指地慢,还好有华中科技大学virtual judge。(题号UVALive 5166)


#include
#include
#include
#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;
}

你可能感兴趣的:(算法竞赛入门经典(第2版))