输出如下如示的数组:
其代码如下:
#include<iostream>
#define N 8
using namespace std;
int main()
{
enum{right,down,left,up};//表示四个方向
///起始点:
int i=0;
int j=0;
///临时点
int ti=i;
int tj=j;
///当前结点等于前一结点时为0,否则为1
bool bl=0;
int dr=right;//开始时向右前进
int a[N][N]={0};
///m为结点总数,当为一个方形为k+1的平方
int m=0;
cout<<i<<j<<endl;
///输出为长为k的文形
for(int k=1;k<N;k++)
{
int s=(k+1)*(k+1);//最小的方形长为2,所以为k+1
while(j<k&&m<s)//方形的横边j长小于文形长k
{///方向为右
if(dr==left)break;//当方向为右时不能向左倒退
if(i==ti&&j==tj&&bl==0)//当前的结点没有输出时输出
{
cout<<i<<j<<"..."<<endl;
a[i][j]=m+1;
m++;//总结点加1;
bl=1;//已输出
}
if(m==s)break;//方形完成输出退出
j++;//向右进一步
bl=0;//输出标志为0
///给临时结点赋值
ti=i;
tj=j;
dr=right;//再向右走
}
while(i<k&&m<s)
{
if(dr==up)break;
if(i==ti&&j==tj&&bl==0)
{
cout<<i<<j<<"***"<<endl;
a[i][j]=m+1;
m++;
bl=1;
}
if(m==s)break;
i++;
bl=0;
ti=i;
tj=j;
dr=down;
}
while(j>0&&m<s)
{
if(dr==right)break;
if(i==ti&&j==tj&&bl==0)
{
cout<<i<<j<<"+++"<<endl;
a[i][j]=m+1;
m++;
bl=1;
}
if(m==s)break;
j--;
bl=0;
ti=i;
tj=j;
dr=left;
}
while(i>0&&m<s)
{
if(dr==down)break;
if(i==ti&&j==tj&&bl==0)
{
cout<<i<<j<<"###"<<endl;
a[i][j]=m+1;
m++;
bl=1;
}
if(m==s)
break;
i--;
bl=0;
ti=i;
tj=j;
dr=up;
}
///每次边长为k时,要输出方形,若不为方形,要继续输出
if(m!=s) k--;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<a[i][j]<<"/t";
}
cout<<endl;
}
return 0;
}
其算法如下