poj3439(广搜)

题意:服务器有两个插头,两个插线的长度给出。并给出n个插座的坐标,在服务器不会断电的基础上,通过俩个插头轮换插板。问从起点插座到终点插座要换几次。

解法:建图用最短路肯定可以。这里我用了广搜。复杂度应该都是n^2;

代码:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;

int n,start,en;
double len1,len2;
struct point
{
    double x,y;
    int num;
} points[1010];
double getdis(int i,int j)
{
    return sqrt((points[i].x-points[j].x)*(points[i].x-points[j].x)+
     (points[i].y-points[j].y)*(points[i].y-points[j].y));
}
int que[10100];
bool rem[1010];
int main()
{
  int t;
  cin>>t;
  while(t--)
  {
        memset(rem,0,sizeof rem);
      scanf("%d%d%d%lf%lf",&n,&start,&en,&len1,&len2);start--,en--;
      for(int i=0;i<n;i++)
        scanf("%lf%lf",&points[i].x,&points[i].y),points[i].num=0;
     que[0]=start;
     rem[start]=1;
     int left=0,right=1;
     while(left<right)
     {
         int t=que[left];left++;
         bool flag=true;
         for(int i=0;i<n;i++)
         {
             if(!rem[i]&&getdis(i,t)<=len1+len2)
             {
                que[right++]=i,points[i].num=points[t].num+1;
                if(i==en)
                flag=false;
                rem[i]=1;
             }
         }
         if(!flag)
            break;
     }
     if(left>=right)
        cout<<"Impossible\n";
     else
     cout<<points[en].num<<endl;
  }
    return 0;
}
/*
2
4 1 4 2.000 1.000
0 0
0 4
4 0
4 4
9 1 4 2.000 300.000
0 7
-6 2
-3 3
6 2
-6 -3
3 -3
6 -3
-3 -7
0 -7
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值