主対角線に平行な成分は行番号と列番号の差が一定、反対角線に平行な成分は行番号と列番号の和が一定なことを利用する。
#include <stdio.h>
int main(void) {
int N = 3;
int i, j;
for (i = -(N - 1); i <= N - 1; i++) { // 行番号と列番号の差
for (j = 0; j < N; j++) { // 列番号
if (0 <= i + j && i + j < N) {
printf(" %d,%d", i + j, j);
}
}
printf("\n");
}
printf("\n");
for (i = 0; i <= 2 * (N - 1); i++) { // 行番号と列番号の和
for (j = 0; j < N; j++) { // 列番号
if (0 <= i - j && i - j < N) {
printf(" %d,%d", i - j, j);
}
}
printf("\n");
}
}
実行結果
0,2
0,1 1,2
0,0 1,1 2,2
1,0 2,1
2,0
0,0
1,0 0,1
2,0 1,1 0,2
2,1 1,2
2,2