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

时间:2022-06-30 20:42:18

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;
}