给定一个起始数(大于等于1,小于等于20)和方阵的阶数(大于等于1,小于等于20),编程求得并输出该折叠方阵。一个起始数为10,4阶折叠方阵为:
/* 折叠方阵的变形:折叠蛇形方阵
蛇形变换方阵与折叠方针的区别为递增方向,
可以根据奇数偶数阶分别讨论*/
//根据数组下标寻找规律,推出递增法则
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,m;
int a[100][100];
int i,j,k=0;
cin>>m>>n;
a[0][0]=m;
for(i=1;i<n;i++)//限制阶数
{
if(i%2==1)
{ k=i;
for(j=0;j<=i;j++)
{
a[j][k]=++m;//从上至下递增
}
j--;//出了循环j值要回退
for(k=k-1;k>=0;k--)
{
a[j][k]=++m;//从右至左递增
}
}
else
{ j=i;
for(k=0;k<=i;k++)
{
a[j][k]=++m;//从从右至左递增
}
k--;//出了循环k值要回退
for(j=j-1;j>=0;j--)
{
a[j][k]=++m;//从下至上递增
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(4)<<a[i][j];
}
cout<<endl;
}
}
//法二:利用对角线上的数,由其向两向发散
/*#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int m,n;
int i,j;
cin>>m>>n;
int a[100][100];
a[0][0]=m;
for(i=1;i<=n-1;i++)
{
a[i][i]=a[i-1][i-1]+2*i;//观察对角线上的数的规律
if(i%2==1)
{
for(j=i;j>=0;j--)
a[j-1][i]=a[j][i]-1;// 往上递减
for(j=i;j>=0;j--)
a[i][j-1]=a[i][j]+1;// 往上递增
}
else
{
for(j=i;j>=0;j--)
a[j-1][i]=a[j][i]+1;//往上递增
for(j=i;j>=0;j--)
a[i][j-1]=a[i][j]-1;//往下递减
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(4)<<a[i][j];
}
cout<<endl;
}
}*/