二维数组的位置访问

对于一个 \(n\times m\) 的二维数组,行 \(1\sim n\),列 \(1\sim m\)

假设有一个 \(7\times 10\) 的矩阵(行 1~7,列 1~10)。

二维数组的同一行、同一列、对角线

1、同一行

行号不变,列号 \(1\sim 10\),例如:输出第 k 行的每个位置 f[k][i]

点击查看代码
#include <stdio.h>
int main() {
	int i, k;
	scanf("%d", &k);
	for (i = 1; i <= 10; ++i) {
		printf("(%d, %d)\n", k, i);
	} 
}

2、同一列

列号不变,行号 \(1\sim 7\),例如:输出第 k 列的每个位置 f[i][k]

点击查看代码
#include <stdio.h>
int main() {
	int i, k;
	scanf("%d", &k);
	for (i = 1; i <= 7; ++i) {
		printf("(%d, %d)\n", i, k);
	} 
}

3、“对角线”(包含其平行线,即45度向下或向上)

image

  • 从左上到右下(45度向下)
    通过观察,不难发现,这条”对角线“上每往下一行,行和列均增加 1,由“同增同减差不变”可得,该对角线上所有 行号-列号 的差均相等。
    若求 \((x,y)\) 所在的这条线上的点 \((i,j)\) 满足 \(j=i+y-x\)
点击查看代码
#include <stdio.h>
int main() {
	int i, x, y;
	scanf("%d%d", &x, &y);
	for (i = 1; i <= 7; ++i) {
		int j = i + y - x;
		if (j>=1 && j<=10)
			printf("(%d, %d)\n", i, j);
	} 
}

  • 从左下到右上(45度向上)
    通过观察,不难发现,这条”对角线“上每往上一行,行减少 1 而列增加 1,由“给来给去和不变”可得,该对角线上所有 行号+列号 的和均相等。
    若求 \((x,y)\) 所在的这条线上的点 \((i,j)\) 满足 \(i=x+y-j\)
点击查看代码
#include <stdio.h>
int main() {
	int i, j, x, y;
	scanf("%d%d", &x, &y);
	for (j = 1; j <= 10; ++j) {
		i = x + y - j;
		if (i>=1 && i<=7)
			printf("(%d, %d)\n", i, j);
	} 
}

二维数组的8个方向

上、下、左、右、左上、右上、左下、右下

点击查看代码
// 根据方向数组访问(x,y)的8个方向的位置
#include <stdio.h>
// 按“上、下、左、右、左上、右上、左下、右下”的顺序
int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
// 假设当前矩形从第1行~第n行,第1列~第m列
int main() {
	int x, y, n, m, i;
	scanf("%d%d%d%d", &n, &m, &x, &y);
	for (i = 0; i < 8; ++i) {
		int xx = x + dx[i], yy = y + dy[i];
		if (xx<1 || xx>n || yy<1 || yy>m) continue;
		printf("(%d, %d)\n", xx, yy);
	} 
}

国际象棋中“马”的方向

image

点击查看代码
#include <stdio.h>
int dx[] = {-2, -2, -1, 1, 2, 2, 1, -1};
int dy[] = {-1, 1, 2, 2, 1, -1, -2, -2};
int main() {
	int x, y, n, m, i;
	scanf("%d%d%d%d", &n, &m, &x, &y);
	for (i = 0; i < 8; ++i) {
		int xx = x + dx[i], yy = y + dy[i];
		if (xx<1 || xx>n || yy<1 || yy>m) continue;
		printf("(%d, %d)\n", xx, yy);
	} 
}

矩阵转置

行变成列,列变成行,形式化的表示:a[i][j] -> a[j][i]

image

例题:

image

点击查看代码
#include <stdio.h>
int a[7][7];
int main() {
    int n, m, i, j;
    scanf("%d%d", &n, &m);
    puts("Before:");
    for (i = 1; i <= n; ++i) {
        for (j = 1; j <= m; ++j) {
            scanf("%d", a[i] + j);
            printf("%4d", a[i][j]);
        }
        puts("");
    }
    puts("After:");
    for (j = 1; j <= m; ++j) {
        for (i = 1; i <= n; ++i) {
            printf("%4d", a[i][j]);
        }
        puts("");
    }
}

posted @ 2025-11-13 08:55  飞花阁  阅读(164)  评论(0)    收藏  举报
//雪花飘落效果