zoukankan      html  css  js  c++  java
  • 矩阵距离

    题目
    题目描述
    假设我们有矩阵,其元素值非零即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("
    ");
        }
        return 0;
    }
  • 相关阅读:
    java发送qq邮件
    HTTP3次握手和4次挥手
    Bootstrap面试题
    Bootstrap
    响应式布局
    JQuery思维导图
    JQuery相关知识点和面试题
    CSS思维导图
    前端面试题
    CSS3实现跑马效果
  • 原文地址:https://www.cnblogs.com/earth833/p/11282054.html
Copyright © 2011-2022 走看看