我在C中有一个项目,我必须对角扫描array[10][15]
,如下图所示。
我想帮助我找到如何以这种方式扫描阵列...... 非常感谢你。
对不起我的英语(我是希腊语)答案 0 :(得分:6)
请注意,沿着每个对角线,差异* i - j
是不变的。所以你有一个嵌套的双循环,其中外部循环超越差异:
第一轮:差异-14,arr[0][14]
第二轮:差异-13,arr[0][13]
,arr[1][14]
...
上一轮:差异+9,arr[9][0]
。
在代码中:
for (int d = -14; d < 10; ++d)
{
for (int i = 0; i < d + 15 && i < 10; ++i)
{
if (i < d) continue;
// access arr[i][i - d];
printf("[%d, %d]\n", i, i - d);
}
}
注意代码中数字10
和15
的外观;图片很容易推广到任意数组边界。
*)或者,正如@Alexey指出的那样,总和 i + j
是不变的,具体取决于图片中原点的位置;在这种情况下,修改循环如下:
for (int d = 0; d <= 9 + 14; ++d)
{
for (int i = 0; i <= d && i < 10; ++i)
{
if (i + 15 <= d) continue;
// use arr[i][d - i];
}
}
答案 1 :(得分:1)
int i, j;
// left arrows
for(i = 0; i < rows; i++)
for(j = 0; j <= i && j < columns; j++)
doSomethingWithCell(grid[i][j]);
// bottom arrows
for(int i = 0; i < columns; i++)
for(int j = rows - 1; j >= 0; j--)
doSomethingWithCell(grid[j][i]);
答案 2 :(得分:1)
这是我的2位:
void scan_array(int* data, int height, int width, void (*handler)(int)) {
int startY = 0;
for (; startY < height; startY ++) {
int ypos = startY;
int xpos = 0;
while (ypos >= 0 && xpos < width) {
handler(*(data + ypos * width + xpos));
ypos--;
xpos++;
}
}
int startX = 1;
for (; startX < width; startX ++) {
int xpos = startX;
int ypos = height - 1;
while (ypos >= 0 && xpos < width) {
handler(*(data + ypos * width + xpos));
ypos--;
xpos++;
}
}
}
void print_elem(int elem) {
printf("%d ", elem);
}
int main(void) {
int data[2][3] = { {1, 2, 3}, {10, 20, 30} };
scan_array(&data[0][0], 2, 3, print_elem);
printf("\n========\n");
int data2[3][2] = { {1, 2}, {10, 20}, {100, 200} };
scan_array(&data2[0][0], 3, 2, print_elem);
printf("\n========\n");
int square[2][2] = { {1, 2}, {10, 20}};
scan_array(&square[0][0], 2, 2, print_elem);
printf("\n========\n");
}
答案 3 :(得分:0)
我将假设您将左上角的大多数单元格标记为0,0,将右下方的单元格标记为10,15。 doSomething就是你在扫描中所做的一切。
//First all the ones starting in col=0
for (rowStart=0; rowStart<numRows ; rowStart++){
colStart=0; //Start on the left boundary
rowOffset=colOffset=0;
while (rowStart+rowOffset > 0 && colStart+colOffset<numCols){
doSomething(array[rowStart+rowOffset][colStart+colOffset]);
colOffset++; rowOffset--; // Move one space to the right and one space up
}
//Second all the diagonals starting in the maxRow
for (colStart=0; colStart<numCols ; numCol++){
rowStart=numRows-1; //Start at the bottom
rowOffset=colOffset=0;
while (rowStart+rowOffset > 0 && colStart+colOffset<numCols){
doSomething(array[rowStart+rowOffset][colStart+colOffset]);
colOffset++; rowOffset--; // Move one space to the right and one space up
}
}
答案 4 :(得分:0)
你可以扫描每14个元素而不是15个。这样你就可以得到对角线。
答案 5 :(得分:0)
我假设我理解你的问题,我读到: 我想在数组中绘制一条对角线,并访问该线穿过的每个单元格。
使用Bresenham Algorithm找出要在数组中访问的单元格,然后返回由Bresenham为您找到的单元格组成的数组。如果您阅读我链接的维基百科文章,您将看到名为plot和setPixel的函数。这些函数的输入是您应该读取的单元格。
答案 6 :(得分:0)
我相信你正在寻找这样的东西:
#include <stdio.h>
int main(int argc, char *argv[]) {
const int ROWS = 10;
const int COLS = 15;
int array[ROWS][COLS];
int i, j;
// left arrows
for (i = 0; i < ROWS; ++i) {
for (j = 0; j <= i && j < COLS; ++j) {
scanf("%d", &array[i - j][j]);
}
}
// bottom arrows
for (j = 1; j < COLS; ++j) {
for (i = 0; i < ROWS && j + i < COLS; ++i) {
scanf("%d", &array[ROWS - i - 1][j + i]);
}
}
// dump to a file, just for testing
FILE *fp = fopen("test.txt", "w");
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < COLS; ++j) {
fprintf(fp, "%d ", array[i][j]);
}
fputc('\n', fp);
}
fclose(fp);
return 0;
}