【九度 OJ 07】叠筐
文章目录
一、题意
二、解答过程
思路:
先定义二维数组,再由内到外一圈一圈填充字符,最后去掉四个角。
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");
}
}
}