码迷,mamicode.com
首页 > 其他好文 > 详细

无限的路

时间:2015-05-27 15:51:34      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

D - 无限的路
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形: 

技术分享


甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
 

Input

第一个数是正整数N(≤100)。代表数据的组数。 
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于100。 
 

Output

对于每组数据,输出两点(x1,y1),(x2,y2)之间的折线距离。注意输出结果精确到小数点后3位。
 

Sample Input

5 0 0 0 1 0 0 1 0 2 3 3 1 99 99 9 9 5 5 5 5
 

Sample Output

1.000 2.414 10.646 54985.047 0.000
 
思路:a了这道题,感觉还不错~中午写出来了,但是开始交的时候错了,第二次交时候数组越界了。好像提交只需要写一组N就行。
(0,0)
(0,1)(1,0)
(0,2)(1,1)(2,0)
(0,3)(1,2)(2,1)(3,0)//横纵坐标和是数组下标i 横坐标逐渐递增加一,纵坐标减一
(0,4)(1,3)(2,2)(3,1)(4,0)
(0,5)(1,4)(2,3)(3,2)(4,1)(5,0)
…… 同一行之间距离是根号2,
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
struct Point
{
	int x;
	int y;
};
Point point[500][500];
void diabiao()
{
	int i,j,xkai,ykai;
	for(i=0;i<=300;i++)
	{
		xkai=0;
		ykai=i;
		for(j=0;j<=i;j++)
		{
			point[i][j].x=xkai;
			point[i][j].y=ykai;
			xkai++; 
			ykai--;
		}
	}
}
double distance(int x1,int y1,int x2,int y2)
{
	return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
int main()
{
	int N,i,x1,y1,x2,y2;
	diabiao();
	cin>>N;
		while(N--)
		{
			int flag1=0;
			int flag2=0;
			int pos1,pos2;
			double sum=0;
           cin>>x1>>y1>>x2>>y2;
		   if(x1+y1==x2+y2)
		   {
			   for(i=0;i<=x1+y1;i++)
			   {
                   if(point[x1+y1][i].x==x1 && point[x1+y1][i].y==y1)
				   {
					   flag1=1;
					   pos1=i;
				   }
				   if(point[x1+y1][i].x==x2 && point[x1+y1][i].y==y2)
				   { 
					   flag2=1;pos2=i;
				   }
				   if(flag1==1 &&flag2==1)
					   break;
			   }
			   printf("%.3lf\n",abs(pos1-pos2)*sqrt(2));
		   }
		   else 
		   {
			   if(x1+y1>x2+y2)
			   {
				   int t;
				   t=x1;
				   x1=x2;
				   x2=t;
                   t=y1;
				   y1=y2;
				   y2=t;
			   }
                     for(i=0;i<=x1+y1;i++)
					 {
                       if(point[x1+y1][i].x==x1 && point[x1+y1][i].y==y1)
					   {
						   pos1=i;
						   break;
					   }
					 }
					sum+=(x1+y1-pos1)*sqrt(2);
                     for(i=0;i<=x2+y2;i++)
					 {
                       if(point[x2+y2][i].x==x2 && point[x2+y2][i].y==y2)
					   {
						   pos2=i;
						   break;
					   }
					 }
			    	sum+=pos2*sqrt(2);
					 //(x1+y1,0) (0,x2+y2)
					int s=x1+y1;
					while(1)
					{	if(x2+y2-(s)==1)
					 {
						 sum+=distance(s,0,0,s+1);
						  printf("%.3lf\n",sum);
						  break;
					 }
					 else
					 {
						 sum+=distance(s,0,0,s+1);
						 sum+=sqrt(2)*(s+1);
						 s=(s+1);
					 }
					}


		   }
		}

  
	return 0;
}

无限的路

标签:

原文地址:http://blog.csdn.net/zuguodexiaoguoabc/article/details/46046687

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!