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;
}