hdu2074--叠框(模拟)

7 篇文章 0 订阅
7 篇文章 0 订阅
- 叠筐 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

Description

需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
 

Input

输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
 

Output

输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
 

Sample Input

     
     
11 B A 5 @ W
 

Sample Output

     
     
AAAAAAAAA ABBBBBBBBBA ABAAAAAAABA ABABBBBBABA ABABAAABABA ABABABABABA ABABAAABABA ABABBBBBABA ABAAAAAAABA ABBBBBBBBBA AAAAAAAAA @@@ @WWW@ @W@W@ @WWW@ @@@ 寻找每一行列字符出现与循环次数的关系,采用模拟的方法求解。 但注意有一个易WA点就是n=1时的输出要单独讨论,并且在两个答案之间的空行是指输出之间要有一个空行,并且一旦没有后续输入,则没有这个空行。
#include <iostream>

using namespace std;

int main()
{
    int n,q=0;
    char a,b;
    while(cin>>n>>a>>b)
    {
        char A,B,C[81];
        int flag=0;
        if(n==1)
        {
            if(q) cout<<endl;
            cout<<a<<endl;continue;
        }
        if(q) cout<<endl;//用q标记,在最开始输出空行则一个输出对应一个空行,并且第一个数据不需要输出空行
        if(((n+1)/2)%2==0) {A=b;B=a;}
        else {A=a;B=b;}
        for(int i=1;i<=n;i++)
        C[i]=A;
        for(int i=1;i<=n-1;i++)
        {
            if(i==1)//第一行和最后一行单独输出。
            {
                cout<<" ";
                for(int j=2;j<=n-1;j++)
                    cout<<A;
                cout<<" "<<endl;
            }
            if(i==n-1)
            {
                cout<<" ";
                for(int j=2;j<=n-1;j++)
                    cout<<A;
                cout<<" "<<endl;
                break;
            }
            if(i<n/2+1)//模拟规律,将其以中心为对称轴,我们可以看出每一次循环该字符串中心部分会不断的改变,并且左右对称变化,改变的长度也不断改变。
            {
                if(flag)
                {
                    for(int x=1+i;x<=n-i;x++)
                    C[x]=A;
                    flag=0;
                }
                else
                {
                    for(int x=i+1;x<=n-i;x++)
                    C[x]=B;
                    flag=1;
                }
            }
            else
            {
                if(flag)
                {
                    for(int x=n-i;x<=i;x++)
                    C[x]=A;
                    flag=0;
                }
                else
                {
                    for(int x=n-i;x<=i;x++)
                    C[x]=B;
                    flag=1;
                }
            }
            for(int y=1;y<=n;y++)
                cout<<C[y];
            cout<<endl;
        }
        q++;
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值