*原题干:设计一个以0为对称轴两侧对称的螺旋矩阵,其中输入的n为奇数,矩阵最大长度不超过15阶。
*参考了很多人的代码后还是决定采用while循环,但代码块过于庞大。
*思路是将数组内的数字先全部赋为〇,两侧的螺旋矩阵在对称轴两侧分别展开。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;cout<<"请输入矩阵阶数";cin>>n;
int a[15][15]={0};
int p=1;int m=(n-1)/2;
int bound_left=m+1,bound_right=n-1;
int bound_up=0,bound_down=n-1;
int flag=m*n+1;
int i=bound_up,j=bound_left;
while(1)
{
while(j<=bound_right)
{
a[i][j]=p++;
j++;
}
if(p==flag)
break;
j--;
bound_up++;
i=bound_up;
while(i<=bound_down)
{
a[i][j]=p++;
i++;
}
if(p==flag)
break;
i--;
bound_right--;
j=bound_right;
while(j>=bound_left)
{
a[i][j]=p++;
j--;
}
if(p==flag)
break;
j++;
bound_down--;
i=bound_down;
while(i>=bound_up)
{
a[i][j]=p++;
i--;
}
if(p==flag)
break;
i++;
bound_left++;
j=bound_left;
};
//现在我们来操刀搞左半边
int q=1;
int left=0,right=m-1;
int up=0,down=n-1;
int k=up;int w=right;
while(1)
{
while(w>=left)
{
a[k][w]=q++;
w--;
}
if(q==flag)
break;
w++;
up++;
k=up;
while(k<=down)
{
a[k][w]=q++;
k++;
}
if(q==flag)
break;
k--;
left++;
w=left;
while(w<=right)
{
a[k][w]=q++;
w++;
}
if(q==flag)
break;
w--;
down--;
k=down;
while(k>=up)
{
a[k][w]=q++;
k--;
}
if(q==flag)
break;
k++;
right--;
w=right;
};
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(4)<<a[i][j];
}
cout<<endl;
}
system("pause");
return 0;
}