TLE#2 #9 #10BFS求助
查看原帖
TLE#2 #9 #10BFS求助
444195
caramel_qwq楼主2022/3/30 19:44

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;
}
2022/3/30 19:44
加载中...