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

3876 단어 PATACodeup
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;제목은 도안이 네모날수록 좋고, n1과 n3은 n2보다 크지 않으며, n1+n2+n3=N+2의 최대치를 만족시켜야 한다.
아이디어:
제목에서 n1+n2+n3-2=N을 알고 이 세 가지는 가능한 한 접근해야 한다(즉 도안이 네모일수록 좋다).즉 n1=n3=(N+2)/3(아래로 정렬);다시 구할 수 있는 n2;
2차원수조의 저장 데이터를 빌려 먼저 균등하게 값을 빈칸으로 하고 제목의 요구에 따라 상응하는 요소를 입력한 다음에 2차원수조를 출력한다.
코드는 다음과 같다. 2차원 그룹을 사용하면 더욱 직관적이다.
#include 
#include 

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 ("
"); } return 0; }

배열을 직접 출력할 수도 있습니다.
코드는 다음과 같습니다.
#include 
#include 

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
", 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 
#include 

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
", str[n - 1 - i]); } for (int i = 0; i < n2; i++) { printf ("%c", str[n1 + i - 1]); } printf ("
"); } return 0; }

좋은 웹페이지 즐겨찾기