C语言中的邻居查找程序代码

时间:2013-07-18 04:17:49

标签: c for-loop multidimensional-array neighbours

说明是编写一个使用二维数组的程序来查找大于其所有邻居的元素。

For example if my input is:

1   2   11
13  5   6
7   6   9

The output would be: 11, 13, 9

由于某种原因,它根本没有显示任何数字。有人可以帮助纠正代码。

以下是代码:

#include <stdio.h>                                          
#include "genlib.h"
#include "simpio.h"

#define N 3                                                 

bool neighbourCheck(int array[N+2][N+2], int i, int j);     
void getArray(int array[N+2][N+2]);

main()                                                  
{
      int array[N+2][N+2], i, j;

      printf("This program will ask you to enter nine integers of an aray.\n");
      getArray(array);
      for (i=1; i<N+1; i++)
      {
                for(j=1; j<N+1; j++)
                {
                         if(neighbourCheck(array, i, j)==TRUE)
                         {
                                        printf("%d\t", array[i][j]);            
                         }        
                }
      }
      getchar();
}

void getArray(int array[N+2][N+2])
{
      int i, j;

      for(j=0;j<=N+1;j++)
      {
                i=0;
                array[i][j]=-1;
                i=4;
                array[i][j]=-1;                   
      }
      for(i=1;i<N+1;i++)
      {
                j=0;
                array[i][j]=-1;
                j=4;
                array[i][j]=-1;                 
      }
      for(i=1;i<N+1;i++)
      {
                for(j=1;j<4;j++)
                {
                                printf("\nEnter a positive integer: ");
                                array[i][j]=GetInteger();                
                }
      }   
}

bool neighbourCheck(int array[N+2][N+2], int i, int j)                      
{
     int l, m;

     for(l=i-1; l<i+1; l++)
     {
                for(m=j-1; m<j-1; m++)
                {
                         if(array[l][m]>=array[i][j])
                         {
                                        return(FALSE);                            
                         }
                         return(TRUE);
                }
     }
}  

谢谢:D

4 个答案:

答案 0 :(得分:1)

我不认为你在检查所有的邻居。

bool neighbourCheck(int array[N+2][N+2], int i, int j)                      
{
   int l, m;
   for(l=i-1; l<i+1; l++)
   {
            for(m=j-1; m<j-1; m++)
            {
                     if(array[l][m]>=array[i][j])
                     {
                                    return(FALSE);                            
                     }
                     return(TRUE);
            }
   }
}  

如果要检查(1,1),则必须将其与{(0,0),(0,1),(0,2),(1,0),(1,2)进行比较, (2,0),(2,1),(2,2)}。但我不会对你的循环进行检查。

bool neighbourCheck(int array[N+2][N+2], int i, int j)                      
{
    int l, m;
    for(l=i-1; l<=i+1; l++)
    {
        for(m=j-1; m<=j+1; m++)
        {
            // Returns false if any of the neighbour element is greater then & equal to current element.
            if(array[l][m]>=array[i][j]) return(FALSE);                          

        }
    } 
    //You will reach end
    return(TRUE);
}

以上代码将与其自身,对角线邻居进行比较但仍然是条件>这样可以避免混淆。

如果你只是想避免与对角线邻居进行比较,那么你可以使用direct if else语句。

工作正常...... 这是完整的代码。

#include <stdio.h>   
#include<stdbool.h>                         
#define N 3                                                 
bool neighbourCheck(int array[N+2][N+2], int i, int j);     
void getArray(int array[N+2][N+2]);
int main()                                                  
{
  int array[N+2][N+2], i, j;
  printf("This program will ask you to enter nine integers of an aray.\n");
  getArray(array);
  for (i=1; i<N+1; i++)
  {
      for(j=1; j<N+1; j++)
      {
           if(neighbourCheck(array, i, j))
               printf("%d\t", array[i][j]);             
      }
  }
  getchar();
}

void getArray(int array[N+2][N+2])
{
  int i, j;

  for(j=0;j<=N+1;j++)
  {
            i=0;
            array[i][j]=-1;
            i=4;
            array[i][j]=-1;                   
  }
  for(i=1;i<N+1;i++)
  {
            j=0;
            array[i][j]=-1;
            j=4;
            array[i][j]=-1;                 
  }
  for(i=1;i<N+1;i++)
  {
            for(j=1;j<4;j++)
            {
                            printf("\nEnter a positive integer: ");
                           scanf("%d",&array[i][j]);             
            }
  }   
}

bool neighbourCheck(int array[N+2][N+2], int i, int j)                      
{
  int l, m;
  for(l=i-1; l<=i+1; l++)
  {
    for(m=j-1; m<=j+1; m++)
    {
        // Returns false if any of the neighbour element is greater then and equal to current element.
        if(array[l][m]>=array[i][j]) return false;                          

    }
} 
//You will reach end
return true;
}

答案 1 :(得分:1)

你必须改变部分

for(l=i-1; l<i+1; l++)
{
        for(m=j-1; m<j-1; m++)

成:

for(l=i-1;l<=i+1;l++)
{
        for(m=j-1;m<=j-1;m++)

干杯!

答案 2 :(得分:0)

在邻居检查功能中使用以下代码

for(l=i-1; l<i+1; l++)
{
  for(m=j-1; m<j-1; m++)
  {
    if(array[l][m]>=array[i][j])
    {
      return(FALSE);                            
    }
    return(TRUE);
  }
}

表示lm的值包含ij,此时测试成为

if(array[i][j]>=array[i][j])

始终为TRUE,您将返回FALSE

另外,进一步看,return TRUE似乎不在应有的位置。在测试所有可能的组合后,您应该只返回TRUE,而不仅仅是第一个。虽然这使您不打印任何数字令人惊讶。

在回应评论时,一种可能的方法是以下替代:

for(l=i-1; l<i+1; l++)
{
  for(m=j-1; m<j+1; m++)
  {
    if (l == i && m == j)
      continue;

    if(array[l][m]>=array[i][j])
    {
      return(FALSE);                            
    }
  }
}
return(TRUE);

答案 3 :(得分:0)

表示(m = j-1; m

在上述语句中对于各种j值,条件总是为false,因此无法进入循环。