3
,打印一个
N*N
的方阵,
N
为每边字符的个数(
3
〈
N
〈
20
),要求最外层为
"X"
,第二层为
"Y"
, 从第三层起每层依次打印数字 0
,
1
,
2
,
3
,
...
例子:当 N =5 ,打印出下面的图形:X X X X XX Y Y Y XX Y 0 Y XX Y Y Y XX X X X X
同志们,找规律!先分成几部分,再从这几部分中找规律。这题很有意思,同志们多在纸上先画一画。
废话不多少,直接上我的代码,同志们可以参考一下,注释我写的很清楚!
#include <stdio.h>
int main()
{
int N = 12;//层数 即 NxN的方阵
// scanf("%d",&N);
int num;//一行或者一列的中心位置
num = (N + 1) / 2; //由于打印出来的图像是对称的,num 就当作 中心位置
//从第一层开始遍历
for(int i=1; i<=N; i++)
{
//如果是第一层 或者最后一层 那么打印一行 X 就行
if( (i == 1) || (i == N))
{
for(int k=1; k<=N; k++)
{
printf("X ");
}
}
//如果是第2层或者倒数第二层
else if( ( i == 2 ) || ( i == N-1))
{
//遍历这一层 从左到右每个位置上的元素
for(int k=1; k<=N; k++)
{
//如果是第一个元素或者最后一个元素 就打印X
if((k == 1) || (k == N))
{
printf("X ");
continue;;
}
else
//否则打印Y
printf("Y ");
}
}
else//从第3层开始,同理,打印的图像是上下对称图像, 那么 每一行的元素 对中心轴 会有相同的一行
{
int x = i;//x = 第几层
if(x > num)//如果层数大于中心轴,那么就用数学关系 将层数 置为 与其轴对称 的层数
{
x = N-x+1; //例如 N = 10, x = 7,那么与第7层有轴对称关系的是第4层
}
//从左到右 遍历这一层上的每一个 位置上的元素
for(int k=1; k<=N; k++)
{
int t = k;//k:记录是第几个位置上的元素
if((t == 1) || (t == N))//第一个位置和最后一个位置 都打印X
{
printf("X ");
}
else if((t == 2) || (t == N-1))//第二个位置和倒数第二个位置 都打印Y
{
printf("Y ");
}
else //其他位置
{
// 同理 每一行的元素 也会有轴对称 的元素
if(k > num)//如果元素位置 大于中心轴
{
//每一行的元素最大是 x-3
int tmp = (N-t+1)-3; //输出的就和 中心轴 另一半一样
if(tmp > x - 3) //如果超过
{
tmp = x - 3;//就置为x-3
printf("%d ",tmp);
}
else
{
printf("%d ",tmp); //打印(N-t+1)-3
}
}
else
{
if(k > x)
{
//最大只能是t-3
t = x;
printf("%d ",t-3);
}
else
{
printf("%d ",t-3);
}
}
}
}
}
printf("\n");
}
}
贴个我的运行截图吧