HDU 2550 百步穿杨(简单模拟)

Problem Description

时维九月,序属三秋,辽军大举进攻MCA山,战场上两军正交锋.辽军统帅是名噪一时的耶律-James,而MCA方则是派出了传统武将中草药123.双方经过协商,约定在十一月八日正午十分进行射箭对攻战.中草药123早早就开始准备,但是他是武将而不是铁匠,造弓箭的活就交给聪明能干的你了,现在告诉你每种弓箭规格,即箭身的长度,以及每种规格弓箭所需要的数目,要求你把需要的弓箭都输出.
弓箭的基本样子为 “>+—+>”,其中”+—+”为箭身,数据保证箭身长度 > 2

Input

首先输入一个t,表示有t组数据,跟着t行: 每行一个N (N < 50 ),接下去有N行,第i行两个整数Ai , Bi,分别代表需要箭身长度为Ai的弓箭Bi枝. (Ai < 30 , Bi < 10 ) 输入数据保证每一个Ai都是不同的.

Output

按照箭身的长度从小到大的顺序依次输出所有需要的弓箭,”每一种”弓箭后输出一个空行.

Sample Input

1
4
3 4
4 5
5 6
6 7

Sample Output

+-+>
+-+>
+-+>
+-+>

+–+>
+–+>
+–+>
+–+>
+–+>

+—+>
+—+>
+—+>
+—+>
+—+>
+—+>

+—-+>
+—-+>
+—-+>
+—-+>
+—-+>
+—-+>
+—-+>

PS:面对不会的知识逃避是没有用的,直面它战胜它!
 1.使用结构体+排序 AC
/*
模块化思路比较清晰 
*/

#include<cstdio>
#include<algorithm>
using namespace std;
//结构体储存箭的信息 
struct J{
    int  L;          //L储存箭的长度 
    int  B;          //B储存箭的枝数 
    char A[40];      //A数组储存箭的形状  
}Bows[60];
//sort()函数需要用到 
bool cmp(J a,J b){
    return a.L<b.L?true:false;
}

void Solve_and_Print(int n){
    sort(Bows,Bows+n,cmp);      //对箭的长度升序排列 
    for(int i=0;i<n;i++){       //控制箭的种类 
        for(int j=1;j<=Bows[i].B;j++){  //控制箭的枝数 
            printf(">+");
            for(int k=1; k<=Bows[i].L-2;k++)
                printf("-");
            printf("+>\n");
        }
        printf("\n");
    }   
}

int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d",&Bows[i].L,&Bows[i].B);
        //调用函数解决并输出箭的形状  
        Solve_and_Print(n);
    }
}
2.纯c 可以看出来结构体的优点了
#include<stdio.h>
    int main()
    {
        int t,n,i,j,k,m;
        int A[50],B[50];
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);//一共有多少组箭 
            for(i=0;i<n;i++)
                scanf("%d%d",&A[i],&B[i]);//A代表箭身长度,B代表多少枝箭
            //根据题目的要求,是箭身从小到大排序,冒泡排序 
            for(i=0;i<n-1;i++)
            {
                for(j=0;j<n-i-1;j++)
                {
                    if(A[j]>A[j+1])
                    {
                        m=A[j];
                        A[j]=A[j+1];
                        A[j+1]=m;
                        //B组也应该同时进行交换 
                        m=B[j];
                        B[j]=B[j+1];
                        B[j+1]=m;
                    }
                }
            }

            //输出部分 
            for(i=0;i<n;i++)//输出n组箭 
            {
                for(j=0;j<B[i];j++)//先找到么一组箭有多少枝
                {
                    //再输出这一组箭的规格 
                    for(k=0;k<A[i]+2;k++)
                    {
                        if(k==0||k==A[i]+1)
                            printf(">");
                        else if(k==1||k==A[i])
                            printf("+");
                        else
                            printf("-");
                    }
                    printf("\n");
                }
                printf("\n");
            }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值