C中相邻位置2D-Array中的相等元素

时间:2018-04-12 08:00:45

标签: c arrays multidimensional-array

我正在编写游戏并需要一个函数来检查整数定义的2D数组中是否存在游戏(每个元素都是整数)。当2个或更多相等元素在位置,行方向或列方向上相邻时存在游戏。我已经按行进行了正常工作,但不管怎样,在按列检查时,它都无法正常工作。

这是我迄今为止所做的:

//Checks if in an array there are two or more adjacent elements
int adjArray(int arr[], int size)

{
    int i = 0, flag = 0;
    for( i = 0; i < size-1; i++)
    {
      if(arr[i] == arr[i+1])
      {
        flag = 1;
        break;
      }
    }

   return flag;
}

int func(int _board[][MAX_BOARD_POS], int numrows, int numcols)
{

   int i = 0 , j = 0, flag = 0,arr[numrows];


   for (i = 0; i < numrows; i++)
   {
      if (adjArray(_board[i],numcols) == 1)
      {
        flag = 1;
        break;
      }
   }

//If there's a play row-wise, no need to check column-wise
if (!flag)
{
    //Get array of column elements to use compareArray function
    for ( i = 0; i < numcols; i++)
    {
        for (j = 0; j < numrows; j++)
        {
            arr[i] = _board[j][i];   
        }

        if (adjArray(arr,numrows) == 1)
        {
            flag = 1;
            break;
        }
    }    
}



return flag;   
}

我不知道我是否足够清楚。 奇怪的是,这些列正在准确打印,但不知何故adjarray(arr,numrows)失败......

3 个答案:

答案 0 :(得分:3)

您的代码非常接近......只有一个小错误:

for (i = 0; i < numcols; i++)
    {
        for (j = 0; j < numrows; j++)
        {
            arr[i] = _board[j][i];
        }

如果仔细观察,很明显,在j循环中,您只需继续在arr中覆盖相同的元素,因为i的值不会改变j循环,所以这应该是

for (i = 0; i < numcols; i++)
    {
        for (j = 0; j < numrows; j++)
        {
            arr[j] = _board[j][i];
        }

话虽如此,这里给出的其他一些方法也值得研究,我只是想你想知道为什么你的代码不能正常工作。

答案 1 :(得分:2)

对于列,如果您只需要检查2个连续元素是否相等,那么您需要

for(j = 0 ; j < numcols && !flag ; j++){
   for(i = 0 ; i < numrows -1 && !flag ; i++){
       if( _board[i][j] == _board[i+1][j])
         flag= 1;
   }
}

顺便提一下,我建议你使用标志作为for的一个条件,所以当你把它改为1(你找到了你想要的元素)时,它会从循环中弹出而不需要使用中断。我觉得这样更优雅。

希望有所帮助:)

答案 2 :(得分:2)

我没有测试它,所以可能有一些错误。

#include <stdbool.h>
#include <stddef.h>
#include <assert.h>

// size_t must be used for size, board[][X] should be avoid write (*board)[X] instead
// use bool if you want return true or false
bool func(int (*board)[MAX_BOARD_POS], size_t numrows, size_t numcols)
{
    // could be just if depend or what you want
    assert(numrows != 0 && numcols != 0);
    // we loop on the first row manualy because board[0 - 1] will not make sense
    for (size_t j = 1; j < numcols; j++) { // declare for loop increment IN the for loop
        if (board[0][j] == board[0][j - 1])
        {
            return true;
        }
    }
    // we loop on the remains rows
    for (size_t i = 1; i < numrows; i++)
    {
        // we do the first manualy because board[i][0 - 1] will not make sense
        if (board[i][0] == board[i - 1][0])
        {
            return true;
        }
        // we can finnaly check the two case in the same loop
        for (size_t j = 1; j < numcols; j++) {
            if (board[i][j] == board[i][j - 1] || board[i][j] == board[i - 1][j])
            {
                return true;
            }
        }
    }
    return false;
}