分析:
本题重点是分析矩阵。一开始看错了蛇,得到另一个矩阵。见附录一。
矩阵:
7 8 1
6 9 2
5 4 3
本文思路在于,先求最外层矩阵,再求内层矩阵。
最外层矩阵又可以分解成四个相似的子问题。
按照举例的矩阵来看:即 1 2、3 4、5 6、7 8。
问题引刃而解。
不过我花了很多时间,大概两个小时,因为一开始的代码没有现在的简洁。
用 i 来代表赋值的次数,可以大幅度减少思维量和代码量。
(官方给的最优代码容易想到,但是不容易表达)
#include<iostream>
using namespace std;
#define maxSize 100
int center=0;
int a[maxSize][maxSize];
int element=1;
void outArray(int c1,int c2) //center
{
if(c1==c2) a[c1][c2]=element; //最后一次赋值
int i=-1;
while(++i<c2-c1) a[c1+i][c2]=element++;i=-1;
while(++i<c2-c1) a[c2][c2-i]=element++;i=-1;
while(++i<c2-c1) a[c2-i][c1]=element++;i=-1;
while(++i<c2-c1) a[c1][c1+i]=element++;i=-1;
}
int main()
{
int n;
cin>>n;
while(center<=n-1-center)
{
outArray(center,n-1-center);
center++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
附录一:
另一种蛇。
/*
/扩展的蛇形方阵
7 6 1
8 5 2
9 4 3*/
#include<iostream>
using namespace stdl
#define maxSize 100
int main()
{
int n;
cin>>n;
int a[maxSize][maxSize];
int i=0; //行号
int element=1;
for (int j=n-1;j>=0;j--) //列号
{
if(i==0) //0 - n-1
{
for(;i<n;i++)
a[i][j]=element++;
}
else if(i==n) //i==n n-1 - 0
{
i--;
for(;i>=0;i--)//while(--i>=0)
a[i][j]=element++;
i++; //i为0
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}