您的位置:首页 > 其它

HDU 1256 画8

2016-04-03 10:26 274 查看


画8

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5356 Accepted Submission(s): 2297



Problem Description

谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发.

Input

输入的第一行为一个整数N,表示后面有N组数据.

每组数据中有一个字符和一个整数,字符表示画笔,整数(>=5)表示高度.

Output

画横线总是一个字符粗,竖线随着总高度每增长6而增加1个字符宽.当总高度从5增加到6时,其竖线宽度从1增长到2.下圈高度不小于上圈高度,但应尽量接近上圈高度,且下圈的内径呈正方形.

每画一个"8"应空一行,但最前和最后都无空行.

Sample Input

2
A 7
B 8


Sample Output

AA
AA  AA
AA  AA
AA
AA  AA
AA  AA
AA

BBB
BB   BB
BB   BB
BBB
BB   BB
BB   BB
BB   BB
BBB


分析:
无脑模拟就好了,他怎么走你怎么走就OK了;但是要注意的几点是下圈的高度和‘8’的kuang宽度,之所以把这题放博客上式因为我在这题PE了很多次 :
首先呢,每个输出之间是有空行的,但最前和最后都是没有空行的;这个很好控制的;
然后就是,每个'8'的 最开始一行和中间一行还有最后一行,是没有空格的,所以不要用空格去填满它;
我们处理的时候,就是先处理哪些比较短的行,让其输出,因为其输出格式是一样的;输出最短的行的时候还要考虑其有多少个字符串需要输出,因为题目中有说过要求的是下圈的圈圈是个正方形,那么我们只要求出下圈的高就好了,并且下圈是尽可能接近上圈的 但是(下圈>=上圈)我们只要用所给长度 (len-3(除了上下圈的无关行))/2 得到的就是上圈的高度,那么下圈的高度自然也是知道了,所以上圈下圈的高度知道了,那么最短行就很容易写出来了;
再然后就是控制空格输出的位置就好了;

给出AC代码:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;

int main()
{
char x;
int y;
int t;
scanf("%d", &t);
while (t--)
{
getchar();
scanf("%c %d", &x, &y);
int z = y / 6 + 1;
int len;
if ((y - 3) % 2 == 0)len = (y - 3) / 2;
else len = (y - 3) / 2 + 1;
int wd = len + 2 * z;

for (int i = 0; i < z; i++)printf(" ");        //输出第一个最短行
for (int i = 0; i < len; i++)printf("%c", x);
//for (int i = 0; i < z; i++)printf(" ");
printf("\n");

for (int i = 0; i < (y-3)/2; i++)          //输出上圈
{
for (int j = 0; j < wd; j++)
{
if (j< z || j>len + z - 1)printf("%c", x);
else printf(" ");
}
printf("\n");
}

for (int i = 0; i < z; i++)printf(" ");      //输出中间的最短行
for (int i = 0; i < len; i++)printf("%c", x);
//for (int i = 0; i < z; i++)printf(" ");
printf("\n");

for (int i = 0; i < len; i++)                 //输出下圈
{
for (int j = 0; j < wd; j++)
{
if (j< z || j>len + z - 1)printf("%c", x);
else printf(" ");
}
printf("\n");
}

for (int i = 0; i < z; i++)printf(" ");       //输出最后的最短行;
for (int i = 0; i < len; i++)printf("%c", x);
//for (int i = 0; i < z; i++)printf(" ");
printf("\n");

if (t)printf("\n");                          //控制每次输出之间有空行;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: