洛谷P1141 01迷宫BFS

蒟蒟蒟蒻的BFS入门

题目链接
用bfs遍历,询问m<=1e5,每次都BFS一次时间复杂度o(nm)肯定会爆,所以用数组存ans,每次搜索的时候把算出来出来的答案赋值给连通块中的所有ans(很好理解,比如a[1][1]可以到a[1][2],那么a[1][2]也可以到a[1][1],你可以到的地方我也能到,所以他们的答案是相同的)
代码如下:

	#include<bits/stdc++.h>
	using namespace std;
	typedef long long ll;
	const int maxn=1e3+10;
	int a[maxn][maxn];
	int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
	bool book[maxn][maxn];
	int ans[maxn][maxn];
	struct node{
	    int x,y;
	    node()
	    {}
	    node(int x,int y){
	        this->x=x;
	        this->y=y;
	    }
	}vv[1100000];
	int n,m;
	void bfs(int x,int y){
	    int head=0,tail=0;
	    book[x][y]=true;
	    vv[tail]=node(x,y);
	    tail++;
	    while(head<tail){
	        node temp=vv[head];
	        for(int i=0;i<4;i++){
	            int tx=temp.x+dir[i][0];
	            int ty=temp.y+dir[i][1];
	            if(tx<1||tx>n||ty<1||ty>n)continue;
	            if(book[tx][ty])continue;
	            if(a[tx][ty]^a[temp.x][temp.y]){
	                vv[tail]=node(tx,ty);
	                tail++;
	                book[tx][ty]=true;
	            }
	        }
	        head++;
	    }
	    for(int i=0;i<tail;i++){
	        ans[vv[i].x][vv[i].y]=tail;
	    }
	}
	int main()
	{
	    std::ios::sync_with_stdio(false);
	    while(cin>>n>>m){
	        for(int i=1;i<=n;i++){
	            for(int j=1;j<=n;j++){
	                char temp;
	                cin>>temp;
	                a[i][j]=temp-'0';
	                ans[i][j]=-1;
	                book[i][j]=false;
	            }
	        }
	        for(int i=0;i<m;i++){
	            int x,y;
	            cin>>x>>y;
	            if(ans[x][y]==-1)bfs(x,y);
	            cout<<ans[x][y]<<endl;
	        }
	    }
		return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值