标签:理解 control col int 开始 div 结果 数据 std
王者之心,金汤玉固,藏污纳垢,豁达快意
#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; } };
标签:理解 control col int 开始 div 结果 数据 std
原文地址:https://www.cnblogs.com/Marigolci/p/12319635.html