矩阵距离

题目
题目描述
假设我们有矩阵,其元素值非零即1

a11........a1m
...................
...................
an1........anm

定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-l) 
输入
输入文件的第一行为两个整数,分别代表n和m。 
接下来的n行,第i行的第 j个字符代表aij
输出
输出包含N行,每行M个用空格分开的数字,其中第i行第j个数字代表
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("\n");
    }
    return 0;
}

 

posted @ 2019-08-01 13:59  Earth616  阅读(422)  评论(0编辑  收藏  举报