我正在制作一个Soduku解算器,所以我需要测试行,列和方块的合法性。我有各自的功能。
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
函数时,我遇到了问题。看起来电路板的向量已经对应于其行进行了排序,这意味着我的列函数无法检测列合法性,因为行不再对应。所以我的问题是,有没有办法使用std::sort
函数,并在本地排序,而不将vector
复制到另一个vector
?你可以想象,这个程序已经效率低下了,我讨厌通过复制向量来实现它。我知道它只是vector
int
的10到10,但仍然是。
答案 0 :(得分:1)
创建一个包含9个bool
元素的数组,初始化为false。循环遍历向量,将您找到的任何数字的索引(减1)设置为true。如果在此过程中遇到已设置为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;