对不起所有写“后半部分应该相似”的人......不是。
不管怎样,给你:
// traverse array diagonally
int c, tmp, x;
for (c = N - 1; c > -N; c--) {
tmp = N - abs(c) - 1;
x = tmp;
while (x >= 0) {
if (c >= 0) {
std::cout << arr[x][tmp - x] << ", ";
}
else {
std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
}
--x;
}
std::cout << "\n";
}
你需要这个来玩游戏吗?
[edit] 再看一遍,我认为我的答案写得不是很好。这是一个快速浏览:
假设 N 是 3。
我们需要的是对坐标组合的迭代,如下所示:
(0, 0)
(1, 0), (0, 1)
(2, 0), (1, 1), (0, 2)
(2, 1), (1, 2)
(2, 2)
首先是一些占位符:
int c, // a counter, set by the outer loop
tmp, // for intermediate results
x; // the x-index into *arr* (*y* will be defined implicitly)
现在这个外循环
for (c = N - 1; c > -N; c--) {
使 c 迭代 {2, 1, 0, -1, 2}。
下一步
tmp = N - abs(c) - 1;
x = tmp;
将 {2, 1, 0, -1, -2} 变成 {0, 1, 2, 1, 0},即此步骤所需的输出减一(因此它们可以用作索引)。我们制作了两个副本,tmp 和 x。
现在我们从x倒数到0:
while (x >= 0) {
...
--x;
}
如果我们在 arr 的左上半部分,由 c >= 0 表示,则 x 索引进入 arr需要从对角线开始并下降到零 (0 到 0, 1 到 0 和 2 到 0) ,而 y 索引需要从零开始并上升到对角线 (0 到 0、0 到 1 和 0 到 2):
if (c >= 0) {
std::cout << arr[x][tmp - x] << ", ";
}
一旦我们在右下半部分,x 索引需要从 N 开始并向下到对角线 (2 到 1 和 2 到 2) em>,而 y 索引需要从对角线开始并上升到 N(1 到 2 和 2 到 2):
else {
std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
}
最后我们只需要在每一行的末尾换行:
std::cout << "\n";
萨维? :-)