C题“段错误”问题
思路是题解做法二的:
提交时一直“段错误”,已经替换掉了所有的 STL,并且确保过数组范围足够了,实在搞不清楚错误原因,难道牛客有什么隐藏的代码限制吗?恳请大佬解答!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=105;
int n,a[N][N];
struct quad{
int x1,y1;
int x2,y2;
}ans[N*N*N];
int ans_idx;
#define PII pair<int,int>
const int dx[10]={-1,1,0,0},dy[10]={0,0,-1,1};
PII from[N][N];
PII used[N*N*N]; int uidx;
PII q[N*N*N]; int head,tail;
void Fill(int sx,int sy)
{
head=1,tail=0;
q[++tail]={sx,sy};
PII cur={0,0};
while(head<=tail)
{
PII p=q[head++];
int x=p.first,y=p.second;
bool leave=false;
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>n || ty<1||ty>n) continue;
if(a[tx][ty]==0)
{
a[tx][ty]=-2;
used[++uidx]={tx,ty};
q[++tail]={tx,ty};
from[tx][ty]={x,y};
}
if(a[tx][ty]==1)
{
cur={tx,ty};
from[tx][ty]={x,y};
leave=true;
break;
}
}
if(leave) break;
}
for(int i=1;i<=uidx;i++)
a[used[i].first][used[i].second]=0;
uidx=0;
a[cur.first][cur.second]=0,a[sx][sy]=2;
while(cur!=(PII){sx,sy})
{
PII nxt=from[cur.first][cur.second];
ans[++ans_idx]={cur.first,cur.second,nxt.first,nxt.second};
cur=nxt;
}
return;
}
#undef PII
char tmpstr[N];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,-1,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%s",tmpstr);
for(int j=1;j<=n;j++)
a[i][j]=tmpstr[j-1]-'0';
}
ans_idx=0;
for(int i=1;i<=(n>>1);i++)
for(int j=1;j<=(n>>1);j++)
Fill(i,j);
printf("%d\n",ans_idx);
for(int i=1;i<=ans_idx;i++)
printf("%d %d %d %d\n",ans[i].x1,ans[i].y1,ans[i].x2,ans[i].y2);
}
return 0;
}