0216 317题复盘

王者之心,金汤玉固,藏污纳垢,豁达快意

#include<bits/bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int shortestDistance(vector<vector<int>>& grid)
    {
        //res最后存储结果,需要找最小值,val记录递归层数(0,-1,-2)表示深度
        int res=INT_MAX,val=0,m=grid.size(),n=grid[0].size();
        vector<vector<int>> sum=grid;
        vector<vector<int>> dirs={{0,-1},{-1,0},{0,1},{1,0}};
        for(int i=0;i<grid.size();++i)
        {
            for(int j=0;j<grid[i].size();++j)
            {
                //如果是房子,就开始bfs更新周围空地距离
                if(grid[i][j]==1)
                {
                    //初始化结果记录
                    res=INT_MAX;
                    //dist存储暂时的距离场
                    vector<vector<int>> dist=grid;
                    //暂存为1(住房)的地址,及其不断bfs扩展的节点压入,确保能都遍历到
                    queue<pair<int,int>> q;
                    //pair数据对可用花括号直接push
                    q.push({i,j});
                    //只要还有住房就得更新空地,才能得到某一空地到所有房屋距离
                    while(!q.empty())
                    {
                        //队列取初值的x,y
                        int a=q.front().first,b=q.front().second;
                        //拿出遍历,自然弹出
q.pop();
//在for循环设值时,尽量避免用i,可能疏忽重复造成重定义
for(int k=0;k<dirs.size();++k)
{
    int x=a+dirs[k][0],y=b+dirs[k][1];
    if(x>=0&&x<m&&y>=0&&y<n&&grid[a][b]==val)
    {
        //代表遍历又加深了一重
--grid[x][y];
//空地距离房子又远了一步
dist[x][y]=dist[a][b]+1;
//这步不太理解为何减一
sum[x][y]+=dist[x][y]-1;
q.push({x,y});
res=min(res,sum[x][y]);
        
}
}
}
//bfs更新到了新的一层要用比之前少1的判断值
                    --val;
                    
}
}
}
return res==INT_MAX?-1:res;
}
};

猜你喜欢

转载自www.cnblogs.com/Marigolci/p/12319635.html