CodeForces 435C Cardiogram-模拟

37 篇文章 0 订阅

http://codeforces.com/problemset/problem/435/C

按他给你的点,在坐标纸画线


可以发现对点(x,y),如果右边的点是在上方,则变成(x+1,y+1)直到相遇,并且向上时 (x,y)往上画线是会落在(x,y)这个格子的,

而向下的过程中点(x,y)画‘\’占用的格子是(x-1,y)

注意不要多余的空格,最后一行和最后一列是不需要用到的



#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001; 
int min(int a,int b)
{return a<b?a:b;} 
int max(int a,int b)
{return a>b?a:b;}

int tm[1005]; 
char ans[2005][2005];
struct node
{
	int x,y;
	node(){}
	node(int a, int b){x=a,y=b;}
};
bool cmp(node a,node b)
{return a.y<b.y;}
node p[2005];
int main()
{ 
	__int64 n;
	__int64 i,j;
 int cun=0;
	scanf("%I64d",&n);
	for (i=1;i<=n;i++)
		scanf("%d",&tm[i]);
	int maxx_row=0;
	int minn_row=0;
	int maxx_col=0;
	int minn_col=0; 
	p[++cun]=node(0,0);
	for (i=1;i<=n;i++)
	{
		int sum1=0;
		for (j=1;j<=i;j++)		//数组列,坐标行
		{ 
			sum1+=tm[j]; 
		}
		int sum2=0;
		for (j=1;j<=i;j++)			//数组行,坐标列
		{
			if (j%2)
			sum2+=tm[j];
			else sum2-=tm[j];
		} 
		if (sum1>maxx_row ) maxx_row=sum1;
		if (sum1<minn_row) minn_row=sum1;
		if (sum2>maxx_col ) maxx_col=sum2;
		if (sum2<minn_col) minn_col=sum2;
		p[++cun]=node(sum2,sum1);
	}
	sort(p+1,p+1+cun,cmp);
	for (i=1;i<cun;i++)
	{
		node t1=p[i];
		node t2=p[i+1];
		if (t2.x>t1.x)
		{
			while(t2.y>t1.y)
			{
				ans[1000+t1.x][1000+t1.y]='/';
				//printf("%d %d\n",t1.x,t1.y);
				t1.y++;
				t1.x++;
			}
		}
		else
		{
				while(t2.x<t1.x)
			{
				ans[1000+t1.x-1][1000+t1.y]='\\';
			//	printf("%d %d\n",t1.x-1,t1.y);
				t1.y++;
				t1.x--;
			}
		}
	}
	

	for (i=maxx_col-1;i>=minn_col;i--)
	{
		for (j=minn_row;j<=maxx_row-1;j++)
		{
			if (ans[1000+i][1000+j]==0)
				printf(" ");
			else
				printf("%c",ans[1000+i][1000+j]);
		}
		printf("\n");
	}

	
	
	return 0;
	
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值