80%求优化
  • 板块P1141 01迷宫
  • 楼主you131
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/11 21:04
  • 上次更新2024/7/11 23:08:12
查看原帖
80%求优化
969575
you131楼主2024/7/11 21:04
//思路:
//bfs
//遍历一次+1
//重点:连通的最后的值都是一样的,所以vis不需要重置 
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
int f[N][N];  //表示迷宫
int vis[N][N]; //访问标记 
int x[4]={-1,0,1,0};    //上右下左 
int y[4]={0,1,0,-1};
int ans[N][N]; //记录结果 
int c=0; //使用bfs的次数 
void bfs(int a,int b){  //a和b表示开始节点,返回访问节点数
	queue<pair<int,int> > q;
	int res=1;
	c++;
//	memset(vis,0,sizeof(vis)); 
	q.push(make_pair(a,b));
	vis[a][b]=c;
	while(!q.empty()){
		pair<int,int> t=q.front(); //取栈顶元素
		q.pop(); 
		for(int i=0;i<4;i++){
			int a1=t.first+x[i];
			int b1=t.second+y[i];
			if(!vis[a1][b1]&&a1>0&&a1<=n&&b1>0&&b1<=n){
				if(f[a1][b1]!=f[t.first][t.second]){
					vis[a1][b1]=c;
					res++;
					q.push(make_pair(a1,b1));
				}
			}
		} 
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(vis[i][j]==c)
				ans[i][j]=res;
		}
	}
}
int main(void){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		for(int j=0;j<s.size();j++)
			f[i][j+1]=s[j]-'0';
	}
	int res=0; 
	for(int i=1;i<=m;i++){
		if(i!=1) cout<<endl;
		int a,b;
		cin>>a>>b;
		if(ans[a][b]==0)
			bfs(a,b);
		cout<<ans[a][b]; 
	}
	return 0;
} 
2024/7/11 21:04
加载中...