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