思路:
输入n;
构建一个n*n的矩阵,初始化所有值为为0
1 2 3 4 5
| #include<cstring>
memset(a,0,sizeof(a));
|
确定第一个元素的位置(这里是a[0][n-1])
给第一个值得位置赋值为1;
a[0][n-1]=1;
注意:
此时进行填数时,是从(0,n-1)的位置开始的,所以切记此时初始化i,j变量:
进行循环填数关键代码如下:
由上面分析图可知从最后一列向下进行填数,如果到达第n个位置,或者是遇到下一个值得内容不是0时,证明之前已经填过数了,结束当前循环填数;
1 2 3 4 5 6 7 8 9
|
while (i<n-1 && !a[i+1][j]) a[++i][j]=++flag;
while (j-1>=0 && !a[i][j-1]) a[i][--j]=++flag;
while (i-1>=0 && !a[i-1][j]) a[--i][j]=++flag;
while (j<n-1 && !a[i][j+1]) a[i][++j]=++flag;
|
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<iostream> #include<iomanip> #include<cstring> using namespace std;
int main() { int n, i, j, flag=0; cin>>n; int a[n][n]; memset(a,0,sizeof(a));
flag=a[i=0][j=n-1]=1;
while(flag<n*n) { while (i+1<n && !a[i+1][j]) a[++i][j]=++flag; while (j-1>=0 && !a[i][j-1]) a[i][--j]=++flag; while (i-1>=0 && !a[i-1][j]) a[--i][j]=++flag; while (j+1<n && !a[i][j+1]) a[i][++j]=++flag; } for (i=0; i<n; ++i) { for (j=0; j<n; ++j) { cout<<setw(3)<<a[i][j]; } cout<<endl; } }
|
结束:
Tony-Chen
2017.10.14
人生本就多磨难,不经打击老天真。