PAT A1031 Hello World for U

前言

傳送門

正文

在這裏插入圖片描述

思路

由題意可知,這個U需要儘可能的正,於是給出我們限制條件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同時n1+n2+n3-2=N。可以看出,n1
就是我們需要輸出的行數,n2就是我們需要輸出的列數,也就是說,
U形圖形兩側的字符數n1和n3總是不超過n2,同時需要是n1和n2儘可能大,
可以參考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因爲k<=n2,因此得出k<= (N+2)/3,也就是說k最大是(N+2)/3

參考題解

#include<iostream>
#include<string>
using namespace std;
/*
由題意可知,這個U需要儘可能的正,於是給出我們限制條件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同時n1+n2+n3-2=N。可以看出,n1
就是我們需要輸出的行數,n2就是我們需要輸出的列數,也就是說,
U形圖形兩側的字符數n1和n3總是不超過n2,同時需要是n1和n2儘可能大, 
可以參考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因爲k<=n2,因此得出k<= (N+2)/3,也就是說k最大是(N+2)/3 
*/
int main(){
	string str;
	int N,n1,n2,n3;
	cin>>str;
	N=str.size();
	n1=(N+2)/3,n3=n1,n2=N+2-2*n1;
	//先輸出n1-1行,注意字符下標是對稱的,最後直接輸出底部最後一行 
	for(int i=0;i<n1-1;i++){
		cout<<str[i];
		//輸出n2-2個空格 
		for(int j=0;j<n2-2;j++)cout<<" "; 
		//輸出對稱位置的字符
		cout<<str[N-1-i]<<endl;
	}
	//輸出最後一行
	for(int i=n1-1;i<N-(n1-1);i++){
		cout<<str[i];
	}
	cout<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章