PTA 7-18 美丽的字符正方形FINAL

7-18 美丽的字符正方形FINAL (10分)

题目:输入一个长度不超过50的由小字字母构成的字符串,输出由这个字符序列构成的最大的正方形。

输入格式:
由小写字母构成的一个字符串。

输出格式:
将字符串围成最大可能的正方形输出,字符串从正方形的左上方开始,按顺时针方向绕行。

输入样例1:
a
输出样例1:
a
输入样例2:
happy
输出样例2:
ha
pp
输入样例3:
abcdefghijklmn
输出样例3:
abcd
l e
k f
j i hg

这道题难点在于"螺旋"
根据计算,正方形的边长等于(字符数除以4)取整+1
比如12个字符边长就是4,11个字符边长就是3
50个字符/4+1就是13行,最大为13行

主函数

int main(){
	char input[170];//这里考虑到最大13*13
	cin>>input;
	print(input);
	return 0;
}

print()函数

void print(char *input){
	int alength = strlen(input);//获取输入字符串的总长度
	//特殊情况,当输入字符数小于4时输入首字符结束函数
	if(alength < 4){
		cout<<input[0]<<endl;
		return ;
	}
	int blength = alength/4+1;//正方形的边长
	alength = alength/4*4;//计算出输入的字符中实际用到的字符数量
	char output[blength][blength];//定义输出的数组
	for(int i = alength;i < pow(blength,2);i++){
		input[i] = ' ';//在输入字符串实际用到的长度开始填充空格
	}
	int j = blength,h = 0,k = 0,l = 0,m = 0;
	for(int i = 0;i < blength;i++){
		for(h = l;h < j;h++){
			output[l][h] = input[m++]; //第一行到第blength/2行(边长为偶数)或第blength/2+1行(边长为奇数)向右
		}
		h--;
		for(j = l+1;j <= h;j++){
			output[j][h] = input[m++]; //最后一列到第blength/2列(边长为偶数)或第blength/2+1列(边长为奇数)向下
		}
		j--;
		for(k = j-1;k >= l;k--){
			output[j][k] = input[m++]; //最后一行到第blength/2行向左
		}
		k++;
		for(l = j-1;l > k;l--){
			output[l][k] = input[m++]; //第一列到第blength/2列向上
		}
		l++;
	}
	//按以上的顺序给output数组赋值
	for(int i = 0;i < blength;i++){
		for(int j = 0;j < blength;j++){
			cout<<output[i][j];//按顺序输出output数组
		}
		cout<<endl;//每一行输出后就回车
	}
}

结果
虽然看上去不是正方形

猜你喜欢

转载自blog.csdn.net/qq_36998526/article/details/106970973