一、题意
二、解答过程
思路:
先定义二维数组,再由内到外一圈一圈填充字符,最后去掉四个角。
Note:
- 中间左上角字符坐标为:
(n/2+1,n/2+1)
- 次中间左上角坐标为:
(n/2+1-1,n/2+1-1)
#include<stdio.h> int main(){ int outputbuf[82][82];//用于预排版的输出缓存 char a,b;//输入的两个字符 int n;//叠筐大小 bool firstcase=true;//是否为第一组数据标志,初始值为true while(scanf("%d %c %c",&n,&a,&b)==3){//scanf()函数返回值是 :成功赋值的数据项数 if(firstcase==true){//若是第一组数据 firstcase=false;//将第一组数据标记成false } else printf("\n"); for(int i=1,j=1;i<=n;i+=2,j++){//从里到外输出每个圈 int x=n/2+1,y=x;// x-=j-1;y-=j-1;//计算每个圈右上角点的坐标 char c=j%2==1 ?a:b;//计算当前圈需要使用哪个字符 for(int k=1;k<=i;k++){ //对当前圈的上、下、左、右边赋值 outputbuf[x+k-1][y]=c;//左边赋值 outputbuf[x][y+k-1]=c;//上边赋值 outputbuf[x+i-1][y+k-1]=c;//右边赋值 outputbuf[x+k-1][y+i-1]=c;//下边赋值 } } if(n!=1){//将四角置位空 outputbuf[1][1]=' '; outputbuf[n][1]=' '; outputbuf[1][n]=' '; outputbuf[n][n]=' '; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%c",outputbuf[i][j]); } printf("\n"); } } }