1031 Hello World for U (20分)
题目链接:PAT A 1031
题目大意:给出一个字符串,要求打印为U型输出。
思路分析:一般图形打印题都是数学找规律题。最左面一列从上到下字符数为n1,下面一行从左到右字符数为n2,最右面一列从上到下字符数为n3。由于最下面一行最左面的字符和最左面一列最下面字符冲突,最下面一行最右面的字符和最右面一列最下面字符冲突,所以总字符数是n1+n2+n3-2。这个U型的要求就是n1要等于n3等于最大的一个数k,这个数k是小于等于n2的(n2大于等于3小于总字符数n1+n2+n3-2),所以我们要找出数k的最大值。所以让n2从3开始自增,由于n1等于n3,即可求出n1的值,一开始n1是最大的,随着n2的增大,n1会逐渐减小,当n1达到小于或等于n2的第一个数时,就跳出循环,此时n1是小于或等于n2的最大的n1,这个n1就是我们要求的n1,n3是等于n1的。随后按照题目要求的图形输出即可~
AC代码:
#include<iostream>
using namespace std;
int main() {
string s;
cin >> s;
int n1, n2;
for(n2 = 3; n2 < s.size(); n2++) {
if((s.size() + 2 - n2) % 2 != 0) //这个数必须为偶数,否则不满足n1=n3的条件
continue;
else {
n1 = (s.size() + 2 - n2) / 2;
if(n1 <= n2) //找到使n1小于等于n2的最大的n1
break;
}
}
for(int i = 0; i < n1 - 1; i++) { //输出图形
cout << s[i];
for(int j = 0; j < n2 - 2; j++)
cout << " ";
cout << s[s.size() - 1 - i] << endl;
}
for(int i = n1 - 1; i < n1 + n2 - 1; i++) //由于最下面一行有n2个字符,而最左面字符下标是n1-1,所以i自增到n1+n2-1
cout << s[i];
return 0;
}