pat 1027 打印沙漏
为了减少循环,将每一行看作一个字符串,对于前h行,第i+1行字符串只要在i行字符串中修改第i位,第max+1-i位为’_'即可。对应地在后h-1行,对于第i行只要修改mid+i,mid-i行为’c’即可。
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main(){
float n=0;char c;
cin>>n>>c;
string s="";
int h=(int)(pow((n+1)/2,0.5));//最大的层数2*h+1,最后一层元素个数是 2n+1;
//向外拓展h-1行
int res=n-(2*h*h-1);
int max=2*h-1;
for(int i=0;i<max+1;i++){
s+=c;
}
for (int i=0;i<h;i++)//前h层
{ s[i]=' ';
s[max+1-i] =' ';
cout<<s.substr(1,max+1)<<endl;
}
int mid=h;
for(int i=1;i<h;i++){//h-1层
s[mid+i]='*';
s[mid-i]='*';
cout<<s.substr(1,max+1)<<endl;
}
cout<<res;
}
但是pat判题结果
orz 求指正