开学后沉迷学习无法自拔(其实是懒),忘记写博客来记录我的学习生涯,直至现在寒假了才想起,现决定解封我的优快云。
刚刚看了下我的第一篇博客(我都差点忘记我写过博客。。。),当时初学编程,那道题的思路完全是错的...... 最恐怖的是还有
几十个人看了那篇QAQ。 大一第一学期已经过去了,学了一个学期ACM,我越来越觉得师兄刚开始说的"人与人之间的差
距有时候可能比人比猪还大"这句话特别在理,同届生恐怖得像魔鬼一样。。。 虽然我现在还不能望其项背,但我还是会坚持
下去。解封之际,先附上上篇博客中那道五个多月前难住我的题的实现代码。
先复述一遍题目
输入一个n,输出一个螺旋向内递增的从1到n^2的n阶方阵(如下图)
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int map[10][10];
void build(int n)
{
int x = 0;
int y = 0;
int tot = map[x][y] = 1;
while(tot<n*n)
{
while(y<n-1&&!map[x][y+1])//最外面一层时遇到边界(-1或n)时停止循环,内层遇到下一个位置为非0(即外层数字已填入)时停止循环
{
map[x][++y] = ++tot;
}
while(x<n-1&&!map[x+1][y])
map[++x][y] = ++tot;
while(y>=1&&!map[x][y-1])
map[x][--y] = ++tot;
while(x>=1&&!map[x-1][y])
map[--x][y] = ++tot;
}
}
void show(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<map[i][j];
if(j==n-1)
cout<<endl;
else
cout<<' ';
//PS:懒得打输出右对齐了,就这样了。。。
}
}
}
int main()
{
int n;
while(cin>>n)
{
memset(map,0,sizeof(map));//没填入的都清0,方便边界判断
build(n);
show(n);
cout<<endl;
}
}