1032: 水陆距离
这道题目,NM的矩阵,如果对每一个水池使用一次BSF。以每一个水池为起点,访问每一个节点一次,则时间复杂度为 水池数NM
如果使用多源BFS,一开始就把所有水池加入队列,这样就可以一次BSF解决一组样例,时间复杂度为NM
问题:一开始对于样例矩阵的输入,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;
}

浙公网安备 33010602011771号