C扫描阵列对角线

时间:2012-01-31 18:55:00

标签: c arrays

我在C中有一个项目,我必须对角扫描array[10][15],如下图所示。

enter image description here

我想帮助我找到如何以这种方式扫描阵列...... 非常感谢你。

对不起我的英语(我是希腊语)

7 个答案:

答案 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);
    }
}

注意代码中数字1015的外观;图片很容易推广到任意数组边界。

*)或​​者,正如@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;
}