题意:已知心电图的几个拐点(心电图是折现构成的),要求你用/和\代表斜线输出心电图
思路:模拟。SORT一下坐标x。比较麻烦的就是 x,y轴 你怎么给应用到一个 二维数组 里来。对于这个情况,我们需要把坐标原点给搞到一个合适的地方。然后注意一下输出。还是看代码把,解释很麻烦。
数据分析: 不分析,没什么特别的数据
复杂度分析:不分析,没什么特别的地方
错误分析:空格没输出对。对于空格,你可以先把空格用1输出,然后看看空格的情况和题目要求是不是一致
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1500];
int ans=0;
int pre1[2000];
int pre2[2000];
char mp[1500][1500];
int sy=0;
struct node
{
int x,y;
}p[2000];
bool cmp(const node a,const node b)
{
return a.x < b.x;
}
int main(void)
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&a[i]);
pre1[i]+=pre1[i-1]+a[i];
if(i%2==0) t=-a[i];
else t=a[i];
pre2[i]+=pre2[i-1]+t;
//cout << pre2[i] << endl;
}
p[0].x=p[0].y=0;
for(int i=1;i<=n;i++)
{
p[i].x=pre1[i];
p[i].y=pre2[i];
}
sort(p,p+n+1,cmp); // 对x进行排序
/*for(int i=0;i<=n;i++) printf("%d %d\n",p[i].x,p[i].y);*/
int miny=INT_MAX,maxy=INT_MIN;
for(int i=0;i<=n;i++)// 找出Y坐标相差的最大值
{
miny=min(miny,p[i].y);
maxy=max(maxy,p[i].y);
}
sy+=maxy+(-miny);// 确定起点sy当时输错了,把sy当做sx把
//printf("%d %d \n",miny ,maxy);
//对于每个点,我们根据sx的位置,进行移动
for(int i=0;i<=n;i++)
{
p[i].y=sy-(p[i].y+(-miny));
}
for(int i=0;i<=n-1;i++) // 取点
{
int x1,x2,y1,y2;
x1=p[i].x;
x2=p[i+1].x;
y1=p[i].y;
y2=p[i+1].y;
if(y1>y2)// 判断y的关系,确定用/还是\
{
x1++,y1--;
while(x1<=x2)
{
mp[x1][y1+1]=47; // 注意一下是y1+1
x1++,y1--;
}
}
else if(y1<y2)
{
x1++,y1++;
while(x1<=x2)
{
mp[x1][y1]=92;
x1++,y1++;
}
}
}
for(int i=1;i<=sy;i++)
{
for(int j=1;j<=pre1[n];j++)
{
if(mp[j][i]==47) //输出注意一下是mp[j][i]
printf("%c",47);
else if(mp[j][i]==92)
printf("%c",92);
else printf(" ");
}
puts("");
}
}