多源bfs
输入
第一行两个整数n,m。
接下来一个N行M列的01矩阵,数字之间没有空格。
数据范围
1≤N,M≤1000
输出
一个N行M列的矩阵B,相邻两个整数之间用一个空格隔开。每个整数表示加农势力存在的毫秒数(最小曼哈顿距离值)
输入样例 1
3 4 0001 0011 0110
输出样例 1
3 2 1 0 2 1 0 0 1 0 0 1
#include<bits/stdc++.h> using namespace std; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int N=1010; char g[N][N]; int d[N][N],n,m; typedef pair<int,int> PII; queue<PII>q; void Build(int n,int m){ memset(d,-1,sizeof(d)); for(int i=0;i<n;i++) for(int j=0;j<m;j++){ char c = getchar(); while (c!='0' && c!='1'){ c = getchar(); } if(c=='1'){ d[i][j]=0; q.push(make_pair(i,j)); //压入队列,多源广搜 } } } void Print(int n,int m){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++) cout<<d[i][j]<<' '; cout<<endl; } } void bfs(){ while(q.size()){ auto t=q.front(); q.pop(); int x=t.first,y=t.second; for(int i=0;i<4;i++){ int a=x+dx[i],b=y+dy[i]; if(a>=0 && a<n && b>=0&& b<m && d[a][b]==-1){ d[a][b]=d[x][y]+1; q.push({a,b}); } } } } int main() { cin>>n>>m; Build(n,m); bfs(); Print(n,m); return 0; }
腐烂的橘子
class Solution { int cnt; int dis[10][10]; int dir_x[4]={0, 1, 0, -1}; int dir_y[4]={1, 0, -1, 0}; public: int orangesRotting(vector<vector<int>>& grid) { queue<pair<int,int> >Q; memset(dis, -1, sizeof(dis)); cnt = 0; int n=(int)grid.size(), m=(int)grid[0].size(), ans = 0; for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j){ if (grid[i][j] == 2){ Q.push(make_pair(i, j)); dis[i][j] = 0; } else if (grid[i][j] == 1) cnt += 1; } } while (!Q.empty()){ pair<int,int> x = Q.front();Q.pop(); for (int i = 0; i < 4; ++i){ int tx = x.first + dir_x[i]; int ty = x.second + dir_y[i]; if (tx < 0|| tx >= n || ty < 0|| ty >= m|| ~dis[tx][ty] || !grid[tx][ty]) continue; dis[tx][ty] = dis[x.first][x.second] + 1; Q.push(make_pair(tx, ty)); if (grid[tx][ty] == 1){ cnt -= 1; ans = dis[tx][ty]; if (!cnt) break; } } } return cnt ? -1 : ans; } }; 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/rotting-oranges/solution/fu-lan-de-ju-zi-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include<bits/stdc++.h> using namespace std; int grid[100][100]; int orangesRotting(int m,int n) { int res=0; int dx[4]={-1,0,0,1};//辅助定位即将被腐烂的橘子的横坐标 int dy[4]={0,1,-1,0};//辅助定位即将被腐烂的橘子的纵坐标,对应构成腐烂橘子的四个污染方向 int sx[100],sy[100],sp=0,no=0; while(true) { bool ok1=false; sp=0; no=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(grid[i][j]==2) { sx[sp]=i,sy[sp]=j; // cout<<sp<<"坐标"<<sx[sp]<<" "<<sy[sp]<<endl; sp++; ok1=true; } if(grid[i][j]==1) { no++; } } } if(no==0)//没有新鲜的橘子了 return res; if(ok1) sp--; bool ok2=false; for(;sp>=0;sp--) { for(int k=0;k<4;k++) { int tx=sx[sp]+dx[k],ty=sy[sp]+dy[k]; if(tx>=0&&tx<m&&ty>=0&&ty<n&&grid[tx][ty]==1) { ok2=true; grid[tx][ty]=2; } } } res++; if(!ok2&&no>0) return -1; } } int main() { int m,n; cin>>m>>n; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>grid[i][j]; } } cout<<orangesRotting(m,n); return 0; }