C题“段错误”问题

思路是题解做法二的:

alt

提交时一直“段错误”,已经替换掉了所有的 STL,并且确保过数组范围足够了,实在搞不清楚错误原因,难道牛客有什么隐藏的代码限制吗?恳请大佬解答!

alt

#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;
}
全部评论
破案了,BFS没判断自身是不是1导致的
点赞 回复 分享
发布于 01-22 08:35 四川

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务