二维数组中相等相邻元素的计数

时间:2019-07-13 21:45:40

标签: c++ arrays 2d

我正在从事一项编程任务,并且停留在一部分上。这些说明要求为2d数组中的相等相邻元素创建一个计数。

我尝试设置2个for循环,然后使用“或”测试具有多个条件的if语句,以测试元素是否相等。问题是if语句只能用于数组内的元素。我尝试过的功能如下所示

int count(int** t, int r, int c) {

int i, j, count = 0;

for (i = 0; i < r; i++) {

for (j = 0; j < c; j++)

if (t[i][j] == t[i - 1][j - 1] || t[i][j] == t[i - 1][j] || t[i][j] == 
t[i - 1][j + 1] || t[i][j] == t[i][j - 1] || t[i][j] == t[i][j + 1] || 
t[i][j] == t[i + 1][j - 1] || t[i][j] == t[i + 1][j] || t[i][j] == t[i + 
1][j + 1])

count++; } 
return count;

}

我是编程新手,请帮忙!

1 个答案:

答案 0 :(得分:0)

您提供的代码几乎没有问题,我将一一介绍给您,

将数组传递给函数

要将多维数组传递给函数,我将向您展示两种实现方法。

1)将多维数组作为一维数组传递 之所以有效,是因为我们知道数组是如何在内存中表示的,而我们对表示的了解就是使C / C ++中的指针成为强大工具的原因。 阅读此answer可以更好地了解内存中数组的表示形式。

数组在内存中线性且连续地表示,因此,如果将数组定义为arr[5][5],则告诉编译器我们需要一个具有足够空间的存储块,用于存储5 * 5 = 25 int数据类型。并且还应该知道数组以行主形式表示,请阅读this以了解有关行主形式的更多信息。 Order of filling elements in row and column major form

元素(此处为ints)以图片中之字形线所描述的方式填充。 因此,在我们的示例数组int arr[5][5]中, arr[0][1]可以访问第一行(*(arr+0*5+1))的第二元素,因为arr给出了数组的基地址,类似地,第五行(arr[4][3]的第四元素)可以通过*(arr+4*5+3)进行访问,这里我们将行索引乘以5,因为每行有5个元素(即列数),因此,考虑到这一点,我们可以编写代码来访问矩阵中的数组元素如下方式

void display(int *arr,int r,int c)
{
    for(unsigned i=0;i<r;++i)
    {
        for(unsigned j=0;j<c;++j)
        {
            cout<<*(arr+i*c+j)<<ends;
        }
        cout<<endl;
    }
}
const unsigned ROW=3,COL=3;
int main()
{
    int arr[ROW][COL]={1,2,3,
                       4,5,6,
                       7,8,9
                    };
    display((int *)arr,ROW,COL);
}

在调用函数时,必须将arr强制转换为(int *),因为最初的arr类型是int (*)[3],即指向3个元素的int数组的指针。

2)将多维数组作为指针传递给函数参数中的数组。

const unsigned ROW=3,COL=3;
void display(int (*arr)[COL],int r,int c)
{
    for(unsigned i=0;i<r;++i)
    {
        for(unsigned j=0;j<c;++j)
        {
            cout<<arr[i][j]<<ends;
        }
        cout<<endl;
    }
}
int main()
{
    int arr[ROW][COL]={1,2,3,
                       4,5,6,
                       7,8,9
                    };
    display(arr,ROW,COL);
}

在此情况下,无需强制转换arr

索引超出范围

在您的代码中,您并不需要注意数组索引是否超出范围,如果您的数组是int arr[5][5]并尝试访问arr[-1][5]arr[5][3],则结果将是不确定的,这就是代码崩溃到系统崩溃(只是一个隐喻)而发生的一切。

牢记这些内容,可以满足您需求的有效代码

int count(int *t, int r, int c)
{

    int i, j, result = 0;

    for (i = 0; i < r; i++)
    {

        for (j = 0; j < c; j++)
        {
            if(i!=r-1)
            {
                if(*(t+i*c+j)==*(t+(i+1)*c+j))
                    ++result;
                if(j!=r-1)
                {
                    if(*(t+i*c+j)==*(t+(i+1)*c+j+1))
                        ++result;
                }
                if(j!=0)
                {
                    if(*(t+i*c+j)==*(t+(i+1)*c+j-1))
                        ++result;
                }
            }
            if(j!=c-1)
            {
                if(*(t+i*c+j)==*(t+i*c+j+1))
                    ++result;
            }
        }
    }
    return result;
}
const unsigned ROW=3,COL=3;
int main()
{

    int arr[ROW][COL]={1,1,2,
                       1,2,3,
                       4,5,2
                    };
    cout<<count((int *)(arr),ROW,COL)<<endl;

}