Leetcode 994.腐烂的的橘子

题目

题目链接

思路
利用队列进行BFS,我这里用了两种方法,
第一种方法借用了一个外部数组,用来存储节点是在第几次侵染时被染成坏橘子的,
这样当一个好橘子将被染成坏橘子时,只需要找到侵染源,然后加1就可以了,坏处是占内存,耗时;
第二种方法是先得到队列中元素的数量,就是上一次侵染所感染的总数,直接循环这么多次就可以了;
代码
typedef pair<int,int> pr;
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int X[4] = {0,1,0,-1};
        int Y[4] = {1,0,-1,0};
        int status[10][10];//外部数组
        memset(status,0,sizeof(status));
        int cnt = 0;
        queue<pr> Q;
        //先将坏的橘子入队
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j] == 2) Q.push(make_pair(i,j));
                else if(grid[i][j] == 1)cnt++;
            }
        }
        //如果好橘子的数量刚开始就等于零,直接返回0
        if(cnt==0) return 0;
        int ans = 0;
        while(!Q.empty()){
            pr ele = Q.front();
            Q.pop(); 
            //对于每一个坏橘子,要依次判断四个方向,是否是坏橘子
            for(int i=0; i<4; i++){
                int x = ele.first+X[i];
                int y = ele.second+Y[i];
                //如果下标合法且该位置是好橘子
                if(x>=0 && x<grid.size() && y>=0 && y<grid[0].size() && grid[x][y]==1){
                    grid[x][y] = 2;
                    cnt--;
                    Q.push(make_pair(x,y));
                    status[x][y] = status[ele.first][ele.second]+1;
                    if(ans < status[x][y]) ans = status[x][y];
                }
            }
        }
        return cnt>0 ? -1:ans;
    }
};
typedef pair<int,int> pr;
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int X[4] = {0,1,0,-1};
        int Y[4] = {1,0,-1,0};
        int cnt = 0;
        queue<pr> Q;
        //先将坏的橘子入队
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j] == 2) Q.push(make_pair(i,j));
                else if(grid[i][j] == 1)cnt++;
            }
        }
        //如果好橘子的数量刚开始就等于零,直接返回0
        if(cnt==0) return 0;
        int ans = 0;
        while(!Q.empty()){
            int size = Q.size();//得到上一次侵染的数量,直接循环就可以了
            //对于每一次侵染,如果flag为true,则表明这轮侵染将一个好橘子变为了坏橘子,侵染次数需要加一
            bool flag = false;
            for(int k = 0; k<size; k++){
                pr ele = Q.front();
                Q.pop();
                //对于每一个坏橘子,要依次判断四个方向,是否是坏橘子
                for(int i=0; i<4; i++){
                    int x = ele.first+X[i];
                    int y = ele.second+Y[i];
                    //如果下标合法且该位置是好橘子
                    if(x>=0 && x<grid.size() && y>=0 && y<grid[0].size() && grid[x][y]==1){
                        grid[x][y] = 2;
                        cnt--;
                        Q.push(make_pair(x,y));
                        flag = true;
                    }
                }
            }
            if(flag) ans++;
        }
        return cnt>0 ? -1:ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值