UVa 227(益智)错误的答案,尽管通过所有提供的测试案例

时间:2015-10-09 19:12:12

标签: c++

这是我提交给UVa在线评判Qn 227的简单代码。(益智)我已经测试了各种测试用例,包括来自debug.org的测试用例,但仍然提交了产品和#34;错误答案"。如果有人能指出错误可能在代码中的位置,或者只是给出一个程序会给出错误答案的测试用例,那将非常感激。

//puzzle
#define LOCAL
#include <stdio.h>
#include <string.h>
#define MAX 5

int read(char s[MAX][MAX])
{
    int blank=0;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            s[i][j]=getchar();
            if(i==0&&j==0&&s[i][j]=='Z')
                return -1;
            else if(s[i][j]==' ')
                blank=i*10+j;
        }
        for(;getchar()!='\n';);
    }
    return blank;
}

int write(char s[MAX][MAX], int blank)
{
    char n;
    while((n=getchar())!='0')
    {
        int c1=(blank/10)%10, c2=blank%10;
        if(n=='\n')
            continue;
        else if(n=='A')
        {
            if(c1==0)
            {
                for(;getchar()!='\n';);
                return 0;
            }
            else
            {
                s[c1][c2]=s[c1-1][c2];
                s[c1-1][c2]=' ';
                blank-=10;
            }
        }
        else if(n=='B')
        {
            if(c1==4)
            {
                for(;getchar()!='\n';);
                return 0;
            }
            else
            {
                s[c1][c2]=s[c1+1][c2];
                s[c1+1][c2]=' ';
                blank+=10;
            }
        }
        else if(n=='L')
        {
            if(c2==0)
            {
                for(;getchar()!='\n';);
                return 0;
            }
            else
            {
                s[c1][c2]=s[c1][c2-1];
                s[c1][c2-1]=' ';
                blank-=1;
            }
        }
        else if(n=='R')
        {
            if(c2==4)
            {
                for(;getchar()!='\n';);
                return 0;
            }
            else
            {
                s[c1][c2]=s[c1][c2+1];
                s[c1][c2+1]=' ';
                blank+=1;
            }
         }
    else
        {
            for(;getchar()!='\n';);
            return 0;
        }
    }
    for(;getchar()!='\n';);
    return 1;
}
int main()
{
    #ifdef LOCAL
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    char s[MAX][MAX];
    memset(s,'\0',sizeof(s));
    int blank, kase=0;
    while((blank=read(s))!=-1)
    {
        if(kase++)
            printf("\n");
        printf("Puzzle #%d:\n",kase);
        if(write(s, blank))
        {
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<4;j++)
                    printf("%c ",s[i][j]);
                printf("%c\n",s[i][4]);
            }
            continue;
        }
        else
            printf("This puzzle has no final configuration.\n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果输入包含无效移动,则write()函数会消耗该输入行的其余部分并返回。但是,明确允许给定拼图的移动跨越多行,因此您的方法不一定消耗拼图的所有剩余移动。如果没有,那么你开始将剩余的未消耗动作解释为下一个谜题的开始。示例案例不包括这样的示例。