具体思路:
1. 初始的时候,行标i=0,列标j=0,data[i][j]=0,此时k = 1(k表示当前矩阵位置到下一位置的运动方向);
2. 当data移动到下一个位置后,此时需要把k变为它当前位置的移动方向。
1) k = 1的时候,k的下一个运动方向可能是 2或者4;
A. data位于矩阵的第一行时,k变为2;
B. data位于矩阵的最下面一行时,k变为4.
2) k = 2的时候,k的下一个运动方向可能是 1或者2或者3;
A. data位于矩阵的第一列时,k变为3;
B. data位于矩阵的最下面一行时,k变为1;
C. data位于矩阵其它位置时,k仍为2.
3) k = 3的时候,k的下一个运动方向可能是 2或者4;
A. data位于矩阵的第一列时,k变为4;
B. data位于矩阵的最后一列时,k变为2.
4) k = 4的时候,k的下一个运动方向可能是1或者3或者4;
A. data位于矩阵的第一行时,k变为1;
B. data位于矩阵的最后一列时,k变为3;
C. data位于矩阵其它位置时,k仍为4.
此外,有左下顶角和右上顶角的位置需要额外关注。
具体代码如下:
1. 初始的时候,行标i=0,列标j=0,data[i][j]=0,此时k = 1(k表示当前矩阵位置到下一位置的运动方向);
2. 当data移动到下一个位置后,此时需要把k变为它当前位置的移动方向。
1) k = 1的时候,k的下一个运动方向可能是 2或者4;
A. data位于矩阵的第一行时,k变为2;
B. data位于矩阵的最下面一行时,k变为4.
2) k = 2的时候,k的下一个运动方向可能是 1或者2或者3;
A. data位于矩阵的第一列时,k变为3;
B. data位于矩阵的最下面一行时,k变为1;
C. data位于矩阵其它位置时,k仍为2.
3) k = 3的时候,k的下一个运动方向可能是 2或者4;
A. data位于矩阵的第一列时,k变为4;
B. data位于矩阵的最后一列时,k变为2.
4) k = 4的时候,k的下一个运动方向可能是1或者3或者4;
A. data位于矩阵的第一行时,k变为1;
B. data位于矩阵的最后一列时,k变为3;
C. data位于矩阵其它位置时,k仍为4.
此外,有左下顶角和右上顶角的位置需要额外关注。
具体代码如下:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
int j = 0;
int k = 1; //运动方向,k=1 表示运动方向从左往右移动,k=2 表示从右上角往左上角移动;
//k=3表示向下移动;k=4表示从左上角往右上角移动
int data[1000][1000] = { {0} };
data[0][0] = 1;
int n;
cin >> n;
while (i != n - 1 || j != n - 1) //不在最后一行或不在最后一列
{
if (k == 1)
{
data[i][j + 1] = data[i][j] + 1;
j = j + 1;
if (i == n - 1)
{
k = 4;
}
else
{
k = 2;
}
}
else if (k == 2)
{
data[i + 1][j - 1] = data[i][j] + 1;
i = i + 1;
j = j - 1;
if (j == 0 && i != n - 1)
{
k = 3;
}
else if (i == n - 1)
{
k = 1;
}
else
{
k = 2;
}
}
else if (k == 3)
{
data[i + 1][j] = data[i][j] + 1;
i = i + 1;
if (j == n - 1)
{
k = 2;
}
else
{
k = 4;
}
}
else if (k == 4)
{
data[i - 1][j + 1] = data[i][j] + 1;
i = i - 1;
j = j + 1;
if (i == 0 && j != n - 1)
{
k = 1;
}
else if (j == n - 1)
{
k = 3;
}
else
{
k = 4;
}
}
}
for (int a = 0; a < n; a++)
{
for (int b = 0; b < n; b++)
{
cout << data[a][b] << " ";
}
cout << endl;
}
}
using namespace std;
int main()
{
int i = 0;
int j = 0;
int k = 1; //运动方向,k=1 表示运动方向从左往右移动,k=2 表示从右上角往左上角移动;
//k=3表示向下移动;k=4表示从左上角往右上角移动
int data[1000][1000] = { {0} };
data[0][0] = 1;
int n;
cin >> n;
while (i != n - 1 || j != n - 1) //不在最后一行或不在最后一列
{
if (k == 1)
{
data[i][j + 1] = data[i][j] + 1;
j = j + 1;
if (i == n - 1)
{
k = 4;
}
else
{
k = 2;
}
}
else if (k == 2)
{
data[i + 1][j - 1] = data[i][j] + 1;
i = i + 1;
j = j - 1;
if (j == 0 && i != n - 1)
{
k = 3;
}
else if (i == n - 1)
{
k = 1;
}
else
{
k = 2;
}
}
else if (k == 3)
{
data[i + 1][j] = data[i][j] + 1;
i = i + 1;
if (j == n - 1)
{
k = 2;
}
else
{
k = 4;
}
}
else if (k == 4)
{
data[i - 1][j + 1] = data[i][j] + 1;
i = i - 1;
j = j + 1;
if (i == 0 && j != n - 1)
{
k = 1;
}
else if (j == n - 1)
{
k = 3;
}
else
{
k = 4;
}
}
}
for (int a = 0; a < n; a++)
{
for (int b = 0; b < n; b++)
{
cout << data[a][b] << " ";
}
cout << endl;
}
}