您的位置:首页 > 其它

PAT乙级1027. 打印沙漏(20)

2017-12-13 21:39 531 查看

题目

链接https://www.patest.cn/contests/pat-b-practise/1027

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****

 ***

  *

 ***

*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****

 ***

  *

 ***

*****

2

思路

先看需要的层数,然后分两半输出,有些麻烦,慢慢调试

误区

把输出看成了

每行 是 5 3 1 3 5 5 3 1 3 5 3 1 3 5 3 1 3 5 3 1 3 ...

无限循环的。。。 测试的 一个也没通过

代码

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main()
{
//freopen("in.txt" , "r" , stdin);
int a;
char b;cin>>a>>b;
int c[1000];//记录每行的*个数
int left;
for(int k=0;k<a;k++)
c[k]=2*k+1;
int i=0;
while(a>0)
{
if(i==0) a=a-1;
else a-=2*c[i];
if(a>=0) {i++;left=a;}
}
i=i-1;
int floor=i;
for(int kk=0;kk<=floor;kk++,i--)
{

for(int j=0;j<=kk-1;j++)
cout<<" ";
for(int s=0;s<c[i];s++)
cout<<b;
cout<<endl;
}
for(int t=1;t<=floor;t++)
{

for(int j=0;j<(floor-t);j++)
cout<<" ";
for(int s=0;s<c[t];s++)
cout<<b;
cout<<endl;
}
if(left>=0)
cout<<left<<endl;
return 0;
}

误区代码

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

int a;
char b;
void puts1() {cout<<b<<b<<b<<b<<b<<endl;}
void puts2() {cout<<" "<<b<<b<<b<<endl;}
void puts3() {cout<<" "<<" "<<b<<endl;}

int main()
{
//freopen("in.txt" , "r" , stdin);//
cin>>a>>b;
int c[1000];//记录每行的*个数
int d[3]={5,3,1};
int pre=0,cnt=0,flag=1;
for(int k=0;k<a;k++)
{
if(cnt==2) flag=-1;
if(cnt==0) flag=1;
c[k]=d[cnt];
cnt=cnt+(flag)*1;
}
int i=0,left=a;
while(a)
{
a-=c[i];
if(a>=0)
{
if(c[i]==5) puts1();
if(c[i]==3) puts2();
if(c[i]==1) puts3();
left=a;
}
else break;
i++;
}
if(left>0)
cout<<left<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: