bfs 80 (TLE两个点)求助
  • 板块P1141 01迷宫
  • 楼主lishengkai
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/2 18:39
  • 上次更新2023/11/2 16:30:24
查看原帖
bfs 80 (TLE两个点)求助
797763
lishengkai楼主2023/10/2 18:39
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1001][1001],x,y,f[1001][1001];
bool b[1001][1001];
int head,tail,q[1000001][3];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
char ch;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
		{
			cin>>ch;
			if(ch==48)
				a[i][j]=0;else
				a[i][j]=1;
		}
	/*for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
			cout<<a[i][j]<<' ';
		cout<<'\n';
	}*/
	for(int i=1;i<=m;++i)
	{
		cin>>x>>y;
		if(f[x][y])
		{
			printf("%d\n",f[x][y]);
			continue;
		}
		head=0,tail=1;
		memset(q,0,sizeof(q));
		q[1][0]=a[x][y];
		q[1][1]=x;
		q[1][2]=y;
		while(head<tail)
		{
			++head;
			for(int j=0;j<4;++j)
			{
				int nh=q[head][1]+dir[j][0];
				int nl=q[head][2]+dir[j][1];
				if(nh<=n&&nh>0&&nl<=n&&nl>0&&(a[nh][nl]^q[head][0]==1)&&!b[nh][nl])
				{
					b[nh][nl]=true;
					++tail;
					q[tail][0]=a[nh][nl];
					q[tail][1]=nh;
					q[tail][2]=nl;
				}
			}
		}
		if(tail>1)
		{
			printf("%d\n",tail-1);
			for(int j=1;j<=tail;++j)
				f[q[j][1]][q[j][2]]=tail-1;
		}else
		{
			printf("1\n");
			f[x][y]=1;
		}
		/*tail-=1;
		printf("%d\n",tail);
		for(int j=1;j<=tail;++j)
			f[q[j][1]][q[j][2]]=tail;*/
	}
	return 0;
}
2023/10/2 18:39
加载中...