习题3-5 Puzzle UVA - 227

这题太能卡人了,都是输入输出卡的。

1.输入的5X5矩阵中,有时一行最后有多个空格和回车

2.输出格式中,每两个输出结果之间间隔一个空行,但是最后一个结果之后没有空行。

3.有时到第四位元素,直接不按空格,直接换行了。

其实思路很简单,先判断是否运动越界,如果是的话就输出无答案,如果没越界,就依次将空格和目标位置元素相互交换。

下面是AC代码,就是把这些小BUG修修补补改出来的,抛砖引玉吧。

#include 
#define N 7
#define M_N 100005
using namespace std;
char ch[N][N],dic[M_N];
pair now;
bool scf(),fg;
int main()  {
    //freopen("input.txt","ra",stdin);
    //freopen("output.txt","wa",stdout);
    int dd=0;
    while (scf())   {
        char c;
        int cnt=0;
        while ((c=getchar())&&c!='0')
            dic[cnt++]=c;
        getchar();
        dic[cnt]='\0';
        bool flag=true;
        int len=strlen(dic);
        for (int i=0;i4||tj<0||tj>4) {
                flag=false;
                break;
            }
            swap(ch[now.first][now.second],ch[ti][tj]);
            now.first=ti,now.second=tj;
        }
        ed:;
        printf("Puzzle #%d:\n",++dd);
        if (flag)   {
            for (int i=0;i<5;i++)   {
                printf("%c",ch[i][0]);
                for (int j=1;j<5;j++)
                    printf(" %c",ch[i][j]);
                printf("\n");
            }
        }
        else    printf("This puzzle has no final configuration.\n");
    }
    return 0;
}

bool scf()  {
    fill(ch[0],ch[0]+N*N,'\0');
    for (int i=0;i<5;i++)   {
        gets(ch[i]);
        if (strlen(ch[i])==1)   return false;
        for (int j=0;j<5;j++)   {
            if (ch[i][j]=='\n') ch[i][j]=' ';
            if (ch[i][j]==' ')
                now.first=i,now.second=j;
        }
        ch[i][5]='\0';
    }
    if (fg)   printf("\n");
    fg=true;
    return true;
}

你可能感兴趣的:(习题3-5 Puzzle UVA - 227)