173.矩阵距离
题意:
求每个数(包括1)到最近的1的距离(曼哈顿距离 就是x+y)
思路:
我看完之后的想法:
这好像就是正难则反,因为如果是你0入队的话你会判断许多没必要的数,如果1入队的话,那么每次都是有必要的了
如果只有1个起点,直接跑bfs 建立虚拟源点(em),可以转换成一个最短路问题,
不过我们做这题是不需要建立虚拟源点的
把所有是1的位置初始化为0,然后把所有1加入到队列中
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int dist[N][N];
int st[N][N];
char g[N][N];
const int INF = 0x3f3f3f3f;
struct node
{
int x,y;
};
int n,m;
int dx[] ={1,-1,0,0};
int dy[] ={0,0,-1,1};
void bfs()
{
memset(dist,0x3f,sizeof dist);
queue<node> q;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j] == '1')
{
dist[i][j] =0;
q.push({i,j});
}
}
}
while(!q.empty())
{
node t = q.front();
q.pop();
for(int i=0;i<4;i++)
{
int fx = t.x+dx[i];
int fy = t.y+dy[i];
if(fx<0||fx>=n||fy<0||fy>=m) continue;
// if(st[fx][fy])continue;
if(dist[fx][fy]!=INF)continue;
// st[fx][fy] = 1;
dist[fx][fy] = dist[t.x][t.y]+1;
q.push({fx,fy});
}
}
}
int main()
{
cin>>n>>m;
for(int i= 0 ;i<n;i++)
cin>>g[i];
bfs();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<dist[i][j]<<" ";
cout<<endl;
}
return 0;
}
前置
队列
性质
- 两端性 没搞懂 (x,x,x,x+1,x+1)
- 单调性
总结
总之就是说明了
我们每次取都是队列的最小值
(所有点只会入队一次,入队的时候就是最小值了,并不是出队的时候才是最小值)