题目描述如下:
思路:
输入n;
构建一个n*n的矩阵,初始化所有值为为0
//加头文件
#include<cstring>
//初始化数据
//a是数组指针,0是初始化值,sizeof(a) ,a数组的大小;
memset(a,0,sizeof(a));
确定第一个元素的位置(这里是a[0][n-1])
给第一个值得位置赋值为1;
a[0][n-1]=1;
注意:
此时进行填数时,是从(0,n-1)的位置开始的,所以切记此时初始化i,j变量:
int i=0,j=n-1;
进行循环填数关键代码如下:
由上面分析图可知从最后一列向下进行填数,如果到达第n个位置,或者是遇到下一个值得内容不是0时,证明之前已经填过数了,结束当前循环填数;
//从a[0][n-1]=1;开始,如果i小于n-1 或者 a[0][n-1]下面(即a[1][n-1])不为0时,结束当前填数
//向下
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;
完整代码如下:
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
int main()
{
int n, i, j, flag=0;
cin>>n;
int a[n][n];
//这句话就是将a[n][n]所有值赋为0;
memset(a,0,sizeof(a));
//这句话好玩
//简单点就是
// int i=0,j=n-1;
// int a[i][j]=1;
// int flag=1;
flag=a[i=0][j=n-1]=1;
//共有 n*n个空格,直到添的数字小于n*n时,填充完毕
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
人生本就多磨难,不经打击老天真。