90分求助,第二个点WA,用宽搜
  • 板块P1141 01迷宫
  • 楼主benjie857
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/14 17:59
  • 上次更新2023/11/5 10:47:04
查看原帖
90分求助,第二个点WA,用宽搜
327960
benjie857楼主2020/10/14 17:59
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
bool vis[10005][10005]; 
string mp[10005];
int vir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int color[10005][10005];
int res[10005];
int p=0;
int BFS(int xx,int yy){
	int ans=0;
	queue<int> R;//行 
	queue<int> L;//列
	//初始化
	R.push(xx);
	L.push(yy);
	vis[xx][yy]=true;
	while(!R.empty()){
		int x = R.front();
		int y = L.front();
		color[x][y]=p;//搜索的地方染色
		for(int i=0;i<4;i++){
			int tx = x+vir[i][0];
			int ty = y+vir[i][1];
			if(tx<0||tx>=n||ty<0||ty>=n)continue;//越界处理 
			if(mp[x][y]=='0'){//在0格上 
				if(mp[tx][ty]=='1'&&!vis[tx][ty]){//移动到1格上 
					vis[tx][ty]=true;
					R.push(tx),L.push(ty);
				} 
			}else{//在1格上 
				if(mp[tx][ty]=='0'&&!vis[tx][ty]){ 
					vis[tx][ty]=true;
					R.push(tx),L.push(ty);
				}
			}
		}
		ans++;
		R.pop();
		L.pop();
	} 
	return ans;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
			cin>>mp[i];
	}
	while(m--){
		int x,y;
		scanf("%d %d",&x,&y);
		if(color[x-1][y-1]>0){//染过颜色 
			printf("%d\n",res[color[x-1][y-1]]);
		}else{//以前没有染过颜色 
			p++;//确定一种颜色 
			res[p]=BFS(x-1,y-1);//将这种颜色的联通图数量记录下来  
			printf("%d\n",res[p]);
		}
		
	}
	return 0;
}
2020/10/14 17:59
加载中...