70pts求助
  • 板块P1141 01迷宫
  • 楼主AAA404
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/10/6 20:55
  • 上次更新2023/10/27 08:25:17
查看原帖
70pts求助
723198
AAA404楼主2022/10/6 20:55

3个点TLE(肯定有人说,TLE了看题解啊,但题解全是连通块,看不懂),求大佬能不能上一个记忆化搜索(自己思路是开一个数组记录每一个坐标能走几步,每次只需要加上就行了,但不会维护数组)

#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
inline int read()
{
	char ch=getchar();long long s=0,w=1;
	while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){s=s*10+ch-48;ch=getchar();}
	return s*w;
}
struct node{
	int x,y,data;
	node(int a,int b,int c)
	{
		x=a,y=b,data=c;
	}
};
int ans=1,n,m,dx[4]={0,0,-1,1},dy[4]={-1,1,0,0},f[2]={1,0};
bool a[1001][1001],vis[1001][1001];
queue<node>q;
inline void bfs(int x,int y)
{
	node h(x,y,a[x][y]);
	vis[x][y]=1;
	q.push(h);
	while(!q.empty())
	{
		for(int i=0;i<=3;i++)
		{
			int nx=q.front().x+dx[i],ny=q.front().y+dy[i];
			if(!vis[nx][ny] && nx>=1 && ny>=1 && nx<=n && ny<=n && f[a[nx][ny]]==q.front().data)
			{
					node t(nx,ny,a[nx][ny]);
					q.push(t);
					vis[nx][ny]=1;
					ans++;
			}
		}
		q.pop();
	}
}
int main()
{
 //	freopen(".in","r",stdin);
 //	freopen(".out","w",stdout);
 	n=read(),m=read();
 	for(int i=1;i<=n;i++)
 	for(int j=1;j<=n;j++)
 	{
 		char ch;
 		cin>>ch;
 		a[i][j]=ch=='1'?1:0;
	}
 	for(int i=1;i<=m;i++)
 	{
 		ans=1;
 		memset(vis,0,sizeof vis);
 		int x=read(),y=read();
 		bfs(x,y);
		cout<<ans<<endl;
	}
 	return 0;
}

2022/10/6 20:55
加载中...