题目
题目描述
假设我们有矩阵,其元素值非零即1
a11........a1m
...................
...................
an1........anm
定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-l)
a11........a1m
...................
...................
an1........anm
定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-l)
输入
输入文件的第一行为两个整数,分别代表n和m。
接下来的n行,第i行的第 j个字符代表aij
接下来的n行,第i行的第 j个字符代表aij
输出
输出包含N行,每行M个用空格分开的数字,其中第i行第j个数字代表
Min(D(aij,axy)) 其中1<=x<=N 1<=y<=M,且axy=1
Min(D(aij,axy)) 其中1<=x<=N 1<=y<=M,且axy=1
样例输入
3 4
0001
0011
0110
样例输出
3 2 1 0
2 1 0 0
1 0 0 1
提示
1≤N,M≤1000
分析
这道题建议用广搜做,时间跑得非常快,但因为太像模板,所以我就不怎么讲了
题解
#include<bits/stdc++.h> #define N 1010 using namespace std; int n,m,px,py; char a[N][N]; int dp[N][N]; queue<int> qx,qy; int dx[4]={1,-1,0,0};//定义方向数组 int dy[4]={0,0,1,-1}; int main() { memset(dp,-1,sizeof(dp));//全部至-1 scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='1') qx.push(i),qy.push(j),dp[i][j]=0;//如果输入值为1,答案置零,推入队列 } } while(!qx.empty()&&!qy.empty()){//如果队列不为空 px=qx.front();qx.pop(); py=qy.front();qy.pop(); for(int i=0;i<4;i++){//四个方向开始搜索 int nx=px+dx[i],ny=py+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m){ if(dp[nx][ny]==-1){//如果没有被访问过 dp[nx][ny]=dp[px][py]+1;//更新答案 qx.push(nx); qy.push(ny); } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%d ",dp[i][j]); } printf(" "); } return 0; }