叠筐(《计算机考研机试指南》P12)

叠筐(《计算机考研机试指南》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
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为偶数则是前一个字母打头, 反之是后一个字母。

你可能感兴趣的:(考研机试复习笔记,考研,算法,c语言)