检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
Check if an element of a 2D grid shares a diagonal, horizontal, or vertical with another element
我正在研究n-queens问题,其中一部分是检查一个女王是否受到另一个女王的威胁,以确定一个好的董事会状态。
我有一个用 0 填充的 2D 数组,在本例中为 4x4:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
我随机填充每行一个女王,在本例中由 1 表示:
0 0 1 0
1 0 0 0
1 0 0 0
0 0 0 1
我需要检查有多少其他作品威胁到给定的碎片。如果女王与另一个女王共享水平、对角线或垂直,则会受到威胁。
但是,我不完全确定如何对角遍历数组。
int checkThreats(vector<vector<int> > board, int r, int c) {
int threats = 0;
// checks vertical and horizontal
for (int i = 0; i < board.size(); i++) {
if (board[i][c] == 1 || board[r][i] == 1) {
threats++;
}
}
// it will count itself as a threat, so less one
threats--;
return threats;
}
这是水平和垂直检查的算法。给定棋盘r, c
上的位置,它检查在左、右、上、下的位置(十字+形状(存在多少个皇后。
取1, 0
的坐标r, c
,检查的位置用x
标记,如果存在威胁,则标o
:
x 0 1 0
o x x x
o 0 0 0
x 0 0 1
在这种情况下,threats == 1
因为我们不计算原始位置。
我的问题是试图沿着对角线找到 x 形的碎片。
对角线的诀窍在于它们的长度不同(总计和单独;考虑到它们仅包含从板的边缘或角落开始的 3 个正方形,但从中间开始包含 5 个正方形(。 这种不规则性使它们更难解释。
一种策略是遍历(比如(行,考虑每行的 0(如果是主题的行(、1(如果一个不在板上(或该行对角线上的 2 个正方形。 要检查的列索引只是c0+(r-r0)
和c0-(r-r0)
。
通过一些试验和错误,我能够让算法工作。以下是在所有方向上遍历的循环:
function check(arr, row, col) {
for (i = 0; i < arr.size(); i++) {} // left/right can be iterated as normal
for (i = 0; i < arr.size(); i++) {} // top/down can be the same
// lower-right diagonal from (row, col)
for (i = row+1, j = col+1; i < arr.size() && i < arr.size(); i++, j++) {}
// upper-left diagonal from (row, col)
for (i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {}
// lower-left diagonal from (row, col)
for (i = row-1, j = col+1; i >= 0 && j < arr.size(); i--, j++) {}
// upper-right diagonal from (row, col)
for (i = row+1, j = col-1; i < arr.size() && j >= 0; i++, j--) {}
}
当然,这仅适用于方形数组。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 我必须计算方阵的对角线元素之和的差值
- 矩阵c++的对角线元素的和
- 返回C 中2D阵列的对角线元素总和
- 在矩阵中找到与主对角线平行的元素
- 如何对主对角线上方的 2D 数组中的元素进行排序
- 从二维数组中给定的索引中求对角线元素的和
- MPI_Scatter,散射对角线元素
- 如何显示非对角线二维阵列元素
- C++:以对角线方式处理2d数组元素