Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数独检查器-如何检查子网格中的重复项_C++_Arrays_Algorithm - Fatal编程技术网

C++ 数独检查器-如何检查子网格中的重复项

C++ 数独检查器-如何检查子网格中的重复项,c++,arrays,algorithm,C++,Arrays,Algorithm,我正在阅读《编程面试要点》一书,遇到了为数独棋盘编写解决方案的问题。我能够很容易地找到如何检查以确保当前元素在当前列和行中的任何其他位置都找不到,但事实证明,在当前子网格中检查重复项是非常重要的 我很难弄清楚的问题是,如何知道当前元素所在的子网格(当您遍历2D数组时)以及子网格的起始位置 书中的解决方案似乎通过执行以下操作来检查每个子网格: bool isValidSudoku(const vector<vector<int>>& partial_assignme

我正在阅读《编程面试要点》一书,遇到了为数独棋盘编写解决方案的问题。我能够很容易地找到如何检查以确保当前元素在当前列和行中的任何其他位置都找不到,但事实证明,在当前子网格中检查重复项是非常重要的

我很难弄清楚的问题是,如何知道当前元素所在的子网格(当您遍历2D数组时)以及子网格的起始位置

书中的解决方案似乎通过执行以下操作来检查每个子网格:

bool isValidSudoku(const vector<vector<int>>& partial_assignment) {
    //Code to check row constraints
    //Code to check col constraints

    //Check region constraints (I'm assuming this is to check each subgrid)

    int region_size = sqrt(partial_assignment.size());
    for (int I = 0; I < region_size; ++I) {
        for (int J = 0; J < region_size; ++J) {
            if (HasDuplicate(partial_assignment, region_size * I),
                region_size * (I + 1), region_size * J,
                region_size * (J + 1)){
                return false;

            }
        }
    }
    return true;

}

//Return true if subarray partial_assignment[start_row : end_row - 1]
//[start_col : end_col -1] contains any duplicates in {1,2,....
// partial_assignment.size()}; otherwise return false.
bool HasDuplicate(const vector<vector<int>>& partial_assignment,
    int start_row, int end_row, int start_col, int end_col) {
    deque<bool> is_present(partial_assignment.size() + 1, false);
    for (int i = start_row; i < end_row;++i) {
        for (int j = start_col; j < end_col;++j) {
            if (partial_assignment[i][j] != 0 &&
                is_present[partial_assignment[i][j]) {
                return true;
            }
            is_present[partial_assignment[i][j]] = true;
        }
    }
    return false;
}
另外,当您可以使用
std::unordered\u映射时,使用
std::deque
检查重复项有何意义?

如果它在矩阵中找到了区域(或子正方形),为什么需要为该子正方形中的每个元素调用has_duplicates()

不是。
isValidSudoku
中的循环从
0
迭代到
region\u size-1
,从标准sudoko从
0
迭代到
2
。然后将每个
I
J
乘以
region\u size
,得到起始行和结束行/列:
0-2
3-5
6-8
hasdeplicate
被调用9次


通过抛出一堆
来分析代码可能是有帮助的。我们最多可以推测,很难具体解释为什么有人选择了一种实现策略而不是另一种。这与您的问题无关,但您在调用
hasdeplicate
时有一个拼写错误:在
region\u size*I
之后,不应该有
。另外,在另一个函数中,
如果(部分分配[i][j]!=0&&is_存在[i][j]
]
。考虑到它的使用方式,它也可能是一个
std::vector
,而
std::unordered_map
对于该作业来说似乎有点过火(开销太大)。“通过抛出一堆cout@xaxxon来分析代码可能会有所帮助哦,是的。更好。对,
hasdeplicate
对于每个子网格只调用9次。我想我更好奇的是为什么在
hasdeplicate
中需要嵌套for循环,因为要检查数组中的重复项,只需要检查您以前是否见过它,这可以通过一个for循环和一个哈希表来完成。您知道为什么需要使用嵌套for循环吗?
vector<vector<int>> partial_assignment = { {5,3,4,6,7,8,9,1,2},
                                {6,7,2,1,9,5,3,4,8},
                                {1,9,8,3,4,2,5,6,7},
                                {8,5,9,7,6,1,4,2,3},
                                {4,2,6,8,5,3,7,9,1},
                                {7,1,3,9,2,4,8,5,6},
                                {9,6,1,5,3,7,2,8,4},
                                {2,8,7,4,1,9,6,3,5},
                                {3,4,5,2,8,6,1,7,9}

    };