大家来看看有没有更好的算法?
/*
*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;
}
[解决办法]
这就差不多了
[解决办法]
#include <iostream>
using namespace std;
#define N 11
#define M (N * 2 -1)
int main()
{
char str[M][M], c;
int n;
int i,j;
n=1;
while(n <=N)
{
if(n==1)
{
c= 'T ';
}
else if(n==2)
{
c= 'J ';
}
else if (n==3)
{
c= '1 ';
}
for(j=n-1; j <=N-n;j++) //合并一起传值既可
{
str[n-1][j]=c;
str[N-n][j]=c;
str[j][n-1]=c;
str[j][N-n]=c;
}
n++;
c++;
}
for(i=0;i <N;i++)
{
for(j=0;j <N;j++)
{
cout < <str[i][j] < < ' ';
}
cout < <endl;
}
return 1;
}
根据LZ的代码修改了一下