大家来看看有没有更好的算法?
/*
* 070426-22:00
* 问题描述
3. 打印一个 N*N 的方阵,N为每边 N=15 打印出下面图形
字符的个数(3<N<20), 要求最 TTTTTTTTTTTTTTT
外一层为"T", 第二层为"J", 从第三层 TJJJJJJJJJJJJJT
起每层依次打印数字 1,2,3,... TJ11111111111JT
(右图以N为15为例) TJ12222222221JT
TJ12333333321JT
TJ12344444321JT
TJ12345554321JT
TJ12345654321JT
TJ12345554321JT
TJ12344444321JT
TJ12333333321JT
TJ12222222221JT
TJ11111111111JT
TJJJJJJJJJJJJJT
TTTTTTTTTTTTTTT
*/
#include <iostream.h>
const int N=15;
int main()
{
char str[N][N],c; //str为方阵数组,c存放当前填充字符
int cir_num,n; //cir_num为圈数,n为圈数计数器
int i,j;
if(N%2) cir_num=N/2+1;
else cir_num=N/2;
n=1; //初始化计数器
while(n<=cir_num)
{
if(n==1) c='T';
else if(n==2) c='J';
else if(n==3) c='1';
for(i=0;i<N;i++) //也可用for(i=n-1;i<=N-n;i++)
for(j=0;j<N;j++) //也可用for(j=n-1;j<=N-n;j++)
{
if((i==n-1||i==N-n)&&(j>=n-1&&j<=N-n)) //对当前圈的两行赋值
str[i][j]=c;
if((j==n-1||j==N-n)&&(i>=n-1&&i<=N-n)) //对当前圈的两列赋值
str[i][j]=c;
}
n++;c++;
}
//输出方阵
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<str[i][j]<<' ';
cout<<endl;
}
return 1;
}