我正在研究此问题的解决方案
有一个数组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;
}
答案 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/