矩阵中元素邻居的最小值

时间:2020-01-23 00:53:38

标签: c

我正在研究此问题的解决方案 有一个数组A和一个数组B。 我们将元素放在数组A中。B[i][j]中的元素将是A[i][j]个邻居中的最小值。
示例:

A[3][4]=
1,2,3,4
5,6,7,8
2,3,4,5

B[3][4]should be:
2,1,2,3
1,2,3,4
3,2,3,4
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int min=0;
    int m,n;
    scanf("%d %d",&m,&n);
    int a[m][n];
    int b[m][n];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    printf("\n");
      for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if (a[i+1][j]<a[i-1][j] && a[i+1][j]<a[i][j-1] && a[i+1][j]<a[i][j+1])
            min=a[i+1][j];
            else if(a[i-1][j]<a[i+1][j] && a[i-1][j]<a[i][j-1] && a[i-1][j]<a[i][j+1])
             min=a[i-1][j];
            else if (a[i][j-1]<a[i+1][j] && a[i][j-1]<a[i-1][j] && a[i][j-1]<a[i][j+1])
             min=a[i][j-1];
            else if(a[i][j+1]<a[i+1][j] && a[i][j+1]<a[i-1][j] && a[i][j+1]<a[i][j-1])
             min=a[i][j+1];

             b[i][j]=min;
        }
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

看起来您的边缘有些问题。您需要进行防御性编程。我将向您展示如何在if情况下做到这一点,并让您将else案例作为练习来做,这将非常相似地完成。所以:

        if ((i+1<m) && ((i==0 || a[i+1][j]<a[i-1][j]) && (j==0 || a[i+1][j]<a[i][j-1]) && (j+1==n || a[i+1][j]<a[i][j+1])))
        min=a[i+1][j];

这个想法是,如果i + 1没有超出范围,则只考虑i + 1。在这种情况下,如果有意义,并且比其他方向小,则将您与其他方向进行比较,然后选择“最小值”。如果由于对方超出范围而使这种比较没有意义,则a [i + 1]默认为较小。

但是,更简单的方法是:

min = INT_MAX;
if ((i+1<m) && (a[i+1][j] < min)) min = a[i+1][j];
if ((i>0) && (a[i-1][j] < min)) min = a[i-1][j];
if ((j+1<n) && (a[i][j+1] < min)) min = a[i][j+1];
if ((j>0) && (a[i][j-1] < min)) min = a[i][j-1];

更简单,对吧?关于INT_MAX,请点击此处查看更多信息:https://www.geeksforgeeks.org/int_max-int_min-cc-applications/

相关问题