bfs+记忆化,吸氧TLE3个大样例点,如何玄学剪枝A?
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#define MAXN 1008
using namespace std;
const int dx[8]={-1,1,0,0};
const int dy[8]={0,0,-1,1};
int n,m,sx,sy,ans;
int ansdis[MAXN][MAXN]={};
char a[MAXN][MAXN];
bool v[MAXN][MAXN];
struct point{
int x,y,step;
};
void bfs(){
memset(v,0,sizeof(v));
queue<point> q;
q.push({sx,sy,1});
ans=1;
v[sx][sy]=1;
while(!q.empty()){
point u=q.front();
q.pop();
for(int i=0;i<4;i++){
int nextx=u.x+dx[i],nexty=u.y+dy[i];
if(nextx>=1&&nextx<=n&&nexty>=1&&nexty<=n&&v[nextx][nexty]==0){
if((a[u.x][u.y]=='0'&&a[nextx][nexty]=='1')||(a[u.x][u.y]=='1'&&a[nextx][nexty]=='0')){
q.push({nextx,nexty,u.step+1});
ans++;
v[nextx][nexty]=1;
}
}
}
}
return ;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
while(m--){
cin>>sx>>sy;
if(ansdis[sx][sy]!=0){
cout<<ansdis[sx][sy]<<"\n";
continue;
}
bfs();
ansdis[sx][sy]=ans;
cout<<ans<<"\n";
}
return 0;
}