该代码在一个在线评判中给出了致命的信号11状态,其中尝试了包括在main中的数组以及全局声明但没有用的随机测试用例。 我知道它的分段错误但无法调试它。它适用于较小的测试用例。
#include<stdlib.h>
#include<stdio.h>
char a[1101][1101];
int main()
{
long long int t,m,n;
scanf("%lld",&t);
while(t--)
{
long long int count;
count=0;
scanf("%lld %lld",&m,&n);
//char a[1001][1001];
long long int l;
for(l=0;l<m;l++)
{
scanf("%s",&a[l]);
}
long long int i,j,p=0,b[1101],d[1101],lolo=0,locale=1;
while(locale==1)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='r')
{
b[p]=i;
d[p]=j;
p++;
}
}
}
//printf("%d\n",p);
for(i=0;i<p;i++)
{
if(a[b[i]-1][d[i]]=='f' && b[i]>=1 && d[i]>=0)
{
a[b[i]-1][d[i]]='r';
lolo=1;
}
if(a[b[i]][d[i]+1]=='f' && d[i]<n-1)
{
a[b[i]][d[i]+1]='r';
lolo=1;
}
if(a[b[i]][d[i]-1]=='f' && d[i]>0)
{
a[b[i]][d[i]-1]='r';
lolo=1;
}
if(a[b[i]+1][d[i]]=='f' && b[i]<m-1)
{
a[b[i]+1][d[i]]='r';
lolo=1;
}
}
//printf("%d lol \n",lolo);
for(i=0;i<p;i++)
{
b[i]=0;
d[i]=0;
}
p=0;
if(lolo==0)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='f')
{
count=-1;
locale=-1;
}
}
}
locale=-1;
}
count++;
lolo=0;
}
printf("%lld\n",count-1);
//printf("%d 00 \n",t);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
a[i][j]='\0';
}
}
}
return 0;
}
答案 0 :(得分:0)
a
是一个2D数组,您正在使用
scanf("%s",&a[l]);
如果您希望将每个字符串存储在不同的行中,则需要执行
scanf("%s",a[l]);
由于它是一个二维数组,a[l]
意味着它只被解除引用一次,并且它给出了每一行的起始地址。
答案 1 :(得分:0)
我可以在您的代码中发现一些错误,但可能会有更多错误我无法继续阅读,因为我很难跟进,因为您在代码中间声明变量并且您使用太少的空白区域,所以我无法分辨什么是变量,什么是表达式,这些都是明显的错误
您可以使用d
未初始化,例如
if (a[b[i] - 1][d[i]] == 'f' && b[i] >= 1 && d[i] >= 0)
您将指针的地址传递给scanf()
此处
scanf("%s", &a[l]);
虽然a[l]
和&a[l]
都是相同的地址,但它们的类型会有所不同,这会影响对它们执行的指针运算。
您始终忽略scanf()
的返回值,阅读this manual page throughly并了解如何使用scanf()
。即使你知道这一切,它仍然很难正确使用它,但它会帮助你避免一些错误。