【发布时间】:2017-01-23 20:17:47
【问题描述】:
我正在寻找一种有效的算法,它从给定索引的点对角、垂直和水平遍历 N x N 方阵。
例如,在一个 4x4 矩阵中,如果[2][1] 是给定的索引,算法应该通过索引搜索另一个给定元素的存在:
[0][1], [1][1], [3][1], // Vertically
[2][0], [2][2], [2][3], // Horizontally
[3][0], [1][2], [0][3], // Diagonally (/)
[1][0], [3][2] // Diagonally (\)
这张照片会更清楚:
注意给定的索引 ([2][1])不包括在搜索中。
我设法用 C++ 编写了一个效率不高的可行解决方案:
int Check(int arr[][100], int i, int j, int q, int n)
{
for (int k = 0; k < n; k++)
if ((arr[i][k] == q && k != j) || (arr[k][j] == q && k != i))
return 1;
//vertical n horizontal
if ((i - j) >= 0)
{
for (int l = i - j, m = 0; l < n; l++)
if (arr[l][m++] == q && l != i && (m - 1) != j)
return 1;
}
else
{
for (int l = j - i, m = 0; l < n; l++)
if (arr[m++][l] == q && (m - 1) != i&&l != j)
return 1;
}
// Diagonal (\)
int l = i, m = j;
while (1)
{
if (l == 0 || m == n - 1)
break;
l--;
m++;
}
if (l == 0)
{
while (m >= 0)
if (arr[l++][m--] == q && (l - 1) != i && (m + 1) != j)
return 1;
}
else
{
while (l < n)
if (arr[l++][m--] == q && (l - 1) != i && (m + 1) != j)
return 1;
}
// Diagonal(/)
return -1;
}
Check() 从元素arr[i][j] 中搜索矩阵arr 对角线、垂直线和水平线。如果q 存在于任一方向,则返回1,否则返回-1。
如何有效地实现上述内容?
任何代码(最好是 C/C++)都会很棒。
【问题讨论】: