对于所有写下“第二部分应该相似”的人,我很抱歉...它并不相似。
无论如何,这里是翻译的内容:
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";
}
你需要这个是为了游戏或者其他什么吗?
[编辑] 再次观察,我认为我的回答写得不太好。下面是一个快速的运行过程:
假设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表示,那么对于arr中的x索引,需要从对角线开始向下到零(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),而y-索引需要从对角线开始并上升到N(1到2和2到2):
else {
std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
}
最后,我们只需要在每行末尾添加一个换行符即可:
std::cout << "\n";
明白了吗?:-)