叠筐(《计算机考研机试指南》P12)
题目描述
把一个个大小差一圈的筐叠上去,由里到外看像一个一个的环
输入
输入一个三元组,分别是:外筐的尺寸 n(大于 0 小于 80 的正奇数)、中心花色字符、外围花色字符。
输出
一个叠筐的图案
示例输入
11 B A
5 @ w
示例输出
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA
@@@
@www@
@w@w@
@www@
@@@
程序代码
#include<stdio.h>
char s1[100];//全局变量
void print_s1(char tag) {//输出函数
printf("\n");
for (int i = 0; s1[i] != tag; i++) {
printf("%c", s1[i]);
}
}
void change(int i, int j, char x, char y) {//置换函数
for(int k = i + 1; k < j; k++){
if(s1[k] == x){
s1[k] = y;
}
else {
s1[k] = x;
}
}
}
void basket() {//主函数
int number;
char x, y;
scanf("%d", &number);
// scanf("%c%c", &x, &y);
x = getchar();
while(x == ' '){
x = getchar();
}
y = getchar();
while(y == ' '){
y = getchar();
}
int i = 0, j =0;
// (number - 1) / 2 奇数后一个, 偶数前一个
printf(" ");
if((number - 1) / 2 % 2 == 0) {
for (int i = 0; i < number - 2; i++) {
printf("%c", x);
}
while(j != number){
s1[j++] = x;
}
}
else {
for (int i = 0; i < number - 2; i++) {
printf("%c", y);
}
while(j != number){
s1[j++] = y;
}
}
char tag;
if(x - 20 == y){
tag = x - 10;
}
else {
tag = x - 20;
}
s1[j--] = tag;
while(i != j){
change(i++, j--, x, y);
print_s1(tag);
}
while(i != 1){
change(--i, ++j, x, y);
print_s1(tag);
}
printf("\n ");
if((number - 1) / 2 % 2 == 0) {
for (int i = 0; i < number - 2; i++) {
printf("%c", x);
}
while(j != number){
s1[j++] = x;
}
}
else {
for (int i = 0; i < number - 2; i++) {
printf("%c", y);
}
while(j != number){
s1[j++] = y;
}
}
}
代码思路
用两个指针分别指向头和尾,每次将两指针中间的字母置换,置换一次输出一次,每次输出完成指针往中间移动一个单元,重合后反向移动。头部和尾部的输出自定义,若满足 (n - 1)/ 2为偶数则是前一个字母打头, 反之是后一个字母。