1032: 水陆距离

这道题目,NM的矩阵,如果对每一个水池使用一次BSF。以每一个水池为起点,访问每一个节点一次,则时间复杂度为 水池数NM
如果使用多源BFS,一开始就把所有水池加入队列,这样就可以一次BSF解决一组样例,时间复杂度为N
M
问题:一开始对于样例矩阵的输入,maze使用了int类型 会把0110当作一个数对待
使用char maze[][],则要么使用%s一行输入,要么“ %c”,使用空格吃掉要读入输入流的回车符或空格,或者cin>>maze[i][j]

#include <bits/stdc++.h>
using namespace std;
const int N=810;
char maze[N][N];
int vis[N][N];
typedef pair<int,int> PII;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
void bsf(queue<PII> q){
	while(!q.empty()){
		auto now=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int x=now.first+dir[i][0];
			int y=now.second+dir[i][1];
			if(x>=0&&y>=0&&x<n&&y<m&&vis[x][y]==-1&&maze[x][y]!='0'){
				vis[x][y]=vis[now.first][now.second]+1;
				q.push({x,y});
			}
		}
	}
}
int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		queue<PII> q;
		memset(maze,0,sizeof(maze));
		memset(vis,-1,sizeof(vis));

		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				scanf(" %c",&maze[i][j]);
//				cin>>maze[i][j]; 
				if(maze[i][j]=='0'){
					q.push({i,j});
					vis[i][j]=0;
				}
			}
		}
		bsf(q);
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				printf("%d ",vis[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}
posted @ 2026-02-11 16:47  peter_shen  阅读(10)  评论(0)    收藏  举报