ZOJ 1002 自己弄没错 为啥提交编译后 出现 Wrong Answer

2024-12-15 16:36:00
推荐回答(1个)
回答1:

0个测试样例,然而zoj中的测试样例可能有数万个,所以建议改成在while里面直接输出。
如果不管m[20]的问题,你的算法可以举两个反例如下:
3
...
..X
.X.
3
...
..X
.XX
正确答案应该是4 3, 而你的输出是3 2.
事实上,所有的测试数据总共有2^1 + 2^4 + 2^9 + 2^16 大约7万个左右,我通过如下一段代码生成所有的测试数据:
/*****************************************************************/
#include
#include
#include
char A[4][4];
int n;
FILE *pFile;
void output(int i, int j)
{
int pi,pj;
if(i==n-1 && j==n-1)
{
A[i][j]='.';
fprintf(pFile,"%d\n",n);
for(pi=0; pi {
for(pj=0; pj fprintf(pFile,"%c",A[pi][pj]);
fprintf(pFile,"\n");
}
A[i][j]='X';
fprintf(pFile,"%d\n",n);
for(pi=0; pi {
for(pj=0; pj fprintf(pFile,"%c",A[pi][pj]);
fprintf(pFile,"\n");
}
}
else
{
A[i][j]='.';
if(j output(i,j+1);
else if(i output(i+1,0);
A[i][j]='X';
if(j output(i,j+1);
else if(i output(i+1,0);
}
}
int main()
{
pFile = fopen("Test.txt","w");
for(n=1; n<=4; n++)
{
output(0,0);
}
n=0;
fprintf(pFile,"%d\n",n);
fclose(pFile);
return 0;
}
/******************************************************************************************/
生成的数据存储在Test.txt中,然后我自己写过一段该题目的正确代码,如下:
/***************************************************************************************************/
#include
#include
#include
int n,m,pi,pj;
int b[4][4];
void num()
{
int p_i,p_j,i,j;
for(p_i=0;p_i for(p_j=0;p_j {
if(b[p_i][p_j]>=0)
{
b[p_i][p_j]=0;
for(i=p_i,j=p_j-1;j>=0&&b[i][j]!=-1;j--)
if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i,j=p_j+1;j if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i-1,j=p_j;i>=0&&b[i][j]!=-1;i--)
if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i+1,j=p_j;i if(b[i][j]!=-3)
b[p_i][p_j]++;
}
}
}
void FindMin()
{
int i,j,minimal=100;
for(i=0;i for(j=0;j {
if(b[i][j]=0)
{
minimal=b[i][j];
pi=i;
pj=j;
}
}
for(j=pj+1;j if(b[pi][j]>=0)
b[pi][j]=-3;
for(j=pj-1;j>=0&&b[pi][j]!=-1;j--)
if(b[pi][j]>=0)
b[pi][j]=-3;
for(i=pi+1;i if(b[i][pj]>=0)
b[i][pj]=-3;
for(i=pi-1;i>=0&&b[i][pj]!=-1;i--)
if(b[i][pj]>=0)
b[i][pj]=-3;
}
int isfull()
{
int i,j;
int is=1;
for(i=0;i for(j=0;j if(b[i][j]>=0)

return is;
}
void count()
{
while(!isfull())
{
num();
FindMin();
b[pi][pj]=-2;
m++;
}

}
int main()
{
int i,j;
char c;
scanf("%d",&n);
while(n)
{
c=getchar();
for(i=0;i {
for(j=0;j {
c=getchar();
if(c=='X') b[i][j]=-1;
else if(c=='.') b[i][j]=0;
}
c=getchar();
}
m=0;
count();
printf("%d\n",m);
scanf("%d",&n);
}
return 0;
}
/**************************************************************************************************/
我把你的代码编译生成exe文件: 1.exe
再把我的代码编译生成exe文件: 2.exe
然后把两个exe以及Test.txt放到一个文件夹,创建批处理文件cmp.bat,内容如下:
1.exeout1.txt
2.exeout2.txt
fc out1.txt out2.txt >result.txt
大意是以Test.txt为输入分别生成输出out1.txt和out2.txt,然后通过C:\Windows\System32下的工具fc.exe比较out1.txt和out2.txt的内容,将不同的部分列出输出到result.txt中。最终就可以得到你的代码的失败样例。
另外,站长团上有产品团购,便宜有保证