螺旋矩阵有几种,有的是由内向外旋转,有的是由外向内旋转,本篇只讨论由外向内旋转的螺旋矩阵。由外向内旋转的螺旋矩阵又可分为顺时针与逆时针两种方式,两者算法一致,只是具体实现时代码有所差异。
算法分析:
对于顺时针旋转矩阵,很容易想到顺时针赋值,但这样存在一个问题,如果阶数N是奇数,最后中间可能会出现一个矩形块没有被赋值,解决办法是对上->方向多赋值一个元素,右↓方向少负责一个元素。如图所示:
第一区块:赋值的时候是行数不变,列数在变
第二区块:列数不变,行数在变
第三区块:同第一区块
第四区块:同第二区块
顺时针算法
#include <iostream>
using namespace std;
int main()
{
int num=1;
int n;
int Array[20][20];
cout<<"输入要创建的螺旋矩阵阶数:";
cin>>n;
for(int i=0;i<=n/2;i++){
//从左到右横的开始
for(int j=i;j<n-i;j++){
Array[i][j]=num++;
}
//从上到下纵的开始
for(int k=i+1;k<n-i-1;k++){
Array[k][n-i-1]=num++;
}
//从右到左横的开始
for(int l=n-i-1;l>i;l--){
Array[n-i-1][l]=num++;
}
//从下到上纵的开始
for(int m=n-i-1;m>i;m--){
Array[m][i]=num++;
}
}
//输出数组
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
printf("%-4d",Array[i][j]);
}
cout<<endl;
}
return 0;
}
逆时针算法类似
#include <iostream>
using namespace std;
int main()
{
int num=1;
int n;
int Array[100][100];
cout<<"输入要创建的螺旋矩阵阶数:";
cin>>n;
for(int i=0;i<=n/2;i++){
//从上到下纵的开始
for(int k=i;k<n-i;k++){
Array[k][i]=num++;
}
//从左到右横的开始
for(int j=i+1;j<n-i-1;j++){
Array[n-i-1][j]=num++;
}
//从下到上纵的开始
for(int m=n-i-1;m>i;m--){
Array[m][n-i-1]=num++;
}
//从右到左横的开始
for(int l=n-i-1;l>i;l--){
Array[i][l]=num++;
}
}
//输出数组
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
printf("%-4d",Array[i][j]);
}
cout<<endl;
}
return 0;
}