A1031. Hello World for U (20)/ 1993 problemB

Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. For example, "helloworld" can be printed as:

h  d
e  l
l  r
lowo
That is, the characters must be printed in the original order, starting top-down from the left vertical line with n 1  characters, then left to right along the bottom line with n 2  characters, and finally bottom-up along the vertical line with n 3  characters. And more, we would like U to be as squared as possible -- that is, it must be satisfied that n 1  = n 3  = max { k| k <= n 2  for all 3 <= n 2  <= N } with n 1  + n 2  + n 3  - 2 = N.

Input Specification:

Each input file contains one test case. Each case contains one string with no less than 5 and no more than 80 characters in a line. The string contains no white space.

Output Specification:

For each test case, print the input string in the shape of U as specified in the description.

Sample Input:
helloworld!
Sample Output:
h   !
e   d
l   l
lowor

题目大意:

输入一串字符长度为N(5<=N<=80),将字符输出为U型,包括两行一列,字符个数分别为n1、n2、n3;

由于u型图案拐角处有两个字符重合,n1+n2+n3 -2 =N; 题目要求图案越方越好,n1n3是不大于n2且满足n1+n2+n3=N+2的最大值

思路:

由题目知n1+n2+n3 -2 =N并且三者要尽可能接近(即图案越方越好); 即n1 = n3= (N + 2)/3(向下取整);再可求得n2;

借助二维数组存储数据,先均赋值为空格,根据题目要求输入相应元素,最后将二维数组输出;

代码如下:使用二维数组会更加直观;

#include <cstdio>
#include <cstring>

int main() {
	char str[100], ans [40][40];
	gets (str);
	int n = strlen (str);
	int n1 = (n + 2) / 3, n3 = n1, n2 = n + 2 - 2 * n1;
	
	for (int i = 1; i <= n1; i++) {					//将ans中要用到的位置赋值空格; 
		for (int j = 1; j <= n2; j++) {
			ans[i][j] = ' ';
		}
	}
	
	int pos = 0;                                                    //从0开始遍历整个数组;
	for (int i = 1; i <= n1; i++) {
		ans[i][1] = str[pos++];					//先赋值第一列n1个字符; 
	} 
	
	for (int j = 2; j <= n2; j++) {
		ans[n1][j] = str[pos++];				//再赋值最后一行n2个字符; 
	}	
	
	for (int i = n3 -1; i >= 1; i--) {
		ans[i][n2] = str[pos++];				//最后赋值最后一列n3个字符,注意顺序自下而上; 
	}
	
	for (int i = 1; i <= n1; i++) {				
		for (int j = 1; j <= n2; j++) {
			printf ("%c", ans[i][j]);
		}
		printf ("\n");
	}
	
 	return 0;
}

还可直接将数组输出:

代码如下:

#include <cstdio>
#include <cstring>

int main() {
	char str[100];
	gets (str);
	int n = strlen (str);
	int n1 = (n + 2) / 3, n3 = n1, n2 = n + 2 - 2 * n1;
	
	for (int i = 0; i < n1 -1 ; i++) {				
			printf ("%c", str[i]);					//输出前n1-1行第一个字符; 
			for (int j = 0; j < n2 - 2; j ++) {				
				printf (" ");						//输出空格; 
			}
	
			printf ("%c\n", str[n - i - 1]);		//输出该行最后一个字符; 
	}
	
	for (int i = 0; i < n2; i++) {                                   //输出n2个字符;
		printf ("%c", str[n1 + i - 1]); 			//字符串下标比字符位置小1;
	}	
		
	return 0;
}
	

codeup中采用多点测试,所以要用到while···EOF,

代码如下:

#include <cstdio>
#include <cstring>

int main() {
	char str[100];
	
	while (scanf ("%s", str) != EOF) {                            //用于输入多组数据;
		int n = strlen (str);
		int n1 = (n + 2) / 3, n3 = n1, n2 = n + 2 - n1 - n3;
		
		for (int i = 0; i < n1 - 1; i++) {
			printf ("%c", str[i]);
			for (int j = 1; j < n2 -1; j++) {
				printf (" ");
			}
			printf ("%c\n", str[n - 1 - i]);
		}
		
		for (int i = 0; i < n2; i++) {
			printf ("%c", str[n1 + i - 1]);
		}
		printf ("\n");
	}

 	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值