作为计算机专业的大一同学,学好数据结构必然要多练习,刚来CSDN,没写过东西,我想利用这个CSDN账号,来分享一些我自己写的题目和有意思的算法,与看我文章的读者们共同学习交流,由于本人水平有限,我的代码不一定是最好的,甚至可供优化的地方很多,我的文章仅供各位学习与参考,本文拒绝网络喷子的评论,谢谢合作!
作业中有这样一道题,输出一个螺旋型矩阵,我想这个题还是很有意思的。先上代码
#include <iostream>
using namespace std;
int main()
{
int a[100][100],n;
cin>>n;
int i,j,k=1;
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
a[i][j]=0;
}
i=1;j=1;
int dir=1;
while(1)
{
while(dir==1)
{
a[i][j]=k;
j++;
k++;
if(a[i][j]!=0||j>n)
{
j--;
i++;
dir=2;
}
}
if(k>n*n)break;
while(dir==2)
{
a[i][j]=k;
i++;
k++;
if(a[i][j]!=0||i>n)
{
i--;
j--;
dir=3;
}
}
if(k>n*n)break;
while(dir==3)
{if(k>n*n)break;
a[i][j]=k;
j--;
k++;
if(a[i][j]!=0||j<1)
{
j++;
i--;
dir=4;
}
}
if(k>n*n)break;
while(dir==4)
{
a[i][j]=k;
i--;
k++;
if(a[i][j]!=0||i<1)
{
i++;
j++;
dir=1;
}
}
if(k>n*n)break;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
这个程序先是把整个矩阵全部赋初值为0,每打印过一个地方这个值就不为0,当碰到边界或者遇到已经打印过的地方就撤回一格,并且换方向,方向用dir这个变量来表示。其中1是向右,2向下,3向左,4向上,刚好对应题目要求的打印方向。
每个方向打印都对应坐标i和j的变化,坐标点赋过值后坐标按照方向产生变化,同时k也自增一次,为下一次打印的值做好准备。当坐标变化后如果遇到边界或到了已经打印的位置,就按照设定方向的反方向后退一格(即上一个打印的位置),然后换方向,此时只有i或j发生变化,而k不变化,因为下一个坐标1值就是k现在的值。如此循环,直到k>n*n,因为每次赋之后k会自增,只有大于才能判定打印完毕,否则会少打一个。
以上就是代码和思路,本文在知乎同步发表
https://zhuanlan.zhihu.com/p/692428652