基本上我想要水平搜索,也垂直搜索。现在我这样做:
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语句
中调用此函数答案 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);
}
您的编译器应该能够确定这只使用尾递归,而您不必担心堆栈帧限制。