A1031. Hello World for U (20)/1993 problemB
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PAT A 1049. Counting Ones (30)제목 The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal fo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.