c++ - 使用标准 :sort to sort locally

标签 c++ sorting vector global local

我正在制作一个数独求解器,因此我需要测试行、列和方 block 的合法性。我有做每件事的功能。

bool Board::isRowLegal(int row){
    sort(theBoard[row].begin(), theBoard[row].end());
    for(int i = 1; i < theBoard[row].size() - 1; ++i){
        if(theBoard[row][i] != 0){
            if(theBoard[row][i] == theBoard[row][i + 1]){
                return false;           
            }   
        }
    }
    return true;
}

bool Board::isColumnLegal(int column){
    vector<int> currentColumn;
    int current = 0;
    for(int i = 1; i < theBoard.size(); ++i){
        currentColumn.push_back(theBoard[i][column]);
    }

    sort(currentColumn.begin(), currentColumn.end());
    for(int j = 0; j < currentColumn.size() - 1; ++j){
        if(currentColumn[j] != 0){
            if(currentColumn[j] == currentColumn[j + 1]){
                return false;           
            }   
        }
    }
    return true;
}

bool Board::isPanelLegal(int rowStart, int colStart){
    vector<int> currentPanel;
    for(int i = rowStart; i < rowStart + THREE; ++i){
        for(int j = colStart; j < colStart + THREE; ++j){
            currentPanel.push_back(theBoard[i][j]);
        }
    }
    sort(currentPanel.begin(), currentPanel.end());
    for(int k = 0; k < currentPanel.size() - 1; ++k){
        if(currentPanel[k] != ZERO){
            if(currentPanel[k] == currentPanel[k + 1]){
                return false;           
            }   
        }
    }   
    return true;
}

我对电路板进行排序,以便我可以测试重复项。当我的程序遇到 isColumnLegal 函数时,我遇到了问题。看起来棋盘的 vector 已经根据其行进行排序,这意味着我的列函数无法检测列合法性,因为行不再对应。所以我的问题是,有没有一种方法可以使用 std::sort 函数并在本地进行排序,而无需将 vector 复制到另一个 vector ?你可以想象,这个程序已经很低效了,我不想再通过复制 vector 来使它变得低效。我知道它只是 int 的 10 x 10 vector 但仍然如此。

最佳答案

创建一个包含 9 个 bool 元素的数组,初始化为 false。遍历 vector ,将找到的任何数字的索引(减一)设置为真。如果在此过程中遇到已设置为 true 的元素,则该行无效。

bool present[9] = {};
for (auto const i : theBoard[row])
{
    if (i != 0)
    {
        if (present[i-1])
            return false;
        present[i-1] = true;
    }
}
return true;

关于c++ - 使用标准 :sort to sort locally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19579545/

相关文章:

PHP 根据键排序数组,顺序为字母顺序,然后是数字,然后是特殊字符

c++ - 在字符串的VECTOR中记录特定子串出现的次数

c++ - std::unordered_map 不断导致错误,这是一个错误吗?

c++ - 有什么方法可以为函数指针比较生成警告?

c++ - 能不调用构造函数就调用析构函数吗?

javascript - 查找数组中的范围

c++ - 多线程输入处理

c - 在C中合并多个排序数组

c++ - vector 删除多个区域,2次删除与单次分配?

c++ - SFML - 尝试从 vector 绘制 Sprite 时程序崩溃