在2D阵列中垂直和水平搜索

时间:2015-08-13 04:01:41

标签: c++

基本上我想要水平搜索,也垂直搜索。现在我这样做:

void checkHorizontal()
for (int iii = 1; iii<Row;; iii++)
{
    for (int jjj = 1; jjj<Col; jjj++)      //for every col
    {
        if(Array[iii][jjj]==sign)
        {
            //do something
        }
        else
        {
            //do something else
        }

    }
}

void checkVertical()
for (int iii = 1; iii<Col;; iii++)
{
    for (int jjj = 1; jjj<Row; jjj++)      //for every row
    {
        if(Array[jjj][iii]==sign)
        {
            //do something
        }
        else
        {
            //do something else
        }

    }
}

然而,除了for循环和if语句中的check函数之外,其他一切都是相同的。我想减少重复的代码,所以我该怎么做才能创建一个更通用的函数,调用者只需要传入说他们是否想要进行水平搜索或垂直搜索(即void check(string mode)和调用者只是{{ 1}})

我知道我可以通过执行以下操作来传递for循环中的check函数:

check("Vertical")

问题是if语句,除了执行函数调用之外,不知道交换数组的最佳方法。 我的建议:

if (mode == "Horizontal")
{
    firstBoundary = cGameBoard.m_nRow;
    secondBoundary = cGameBoard.m_nCol;
}
else if (mode == "Vertical")
{
    firstBoundary = cGameBoard.m_nCol;
    secondBoundary = cGameBoard.m_nRow;
}
void check(string mode)
for (int iii = 1; iii<firstBoundary;; iii++)
{
    for (int jjj = 1; jjj<secondBoundary; jjj++)     
    {
        if(Array[jjj][iii]==sign)
        {
            //do something
        }
        else
        {
            //do something else
        }

    }
}

并在if语句

中调用此函数

1 个答案:

答案 0 :(得分:0)

您的解决方案应该有效。

void check(bool dir){  // Using a bool will have better performance for checking the mode than string comparisons. Especially since you only have two directions
  size_t iEnd = (dir)? cols : rows;
  size_t jEnd = (dir)? rows : cols;
  for (size_t i = 0; i < iEnd; ++i){
    for (size_t j = 0; j < jEnd; ++j){
      if(cond(i, j, dir)){
        // Do something
      } else {
        // Do something else
      }
    }
  }
}

bool cond(const size_t& i, const size_t& j, bool dir){
  if (dir){
    return array[i][j] == sign;
  } else {
    return array[j][i] == sign;
  }
}

使用递归

可以获得相同的结果
void check(size_t i, size_t j, bool dir){
  if (ROW + COL - (i+j) == 1) return;  /* end recursion */
  if (i == ROW) return check(0, j+1, dir);
  if (j == COL) return check(i+1, 0, dir);
  if (array[i][j] == sign){
     // Do Something
  } else {
     // Do Something Else
  }
  if (dir)
    return check(i+1, j, dir);
  return check(i, j+1, dir);
}

您的编译器应该能够确定这只使用尾递归,而您不必担心堆栈帧限制。

相关问题