2011阿里巴巴程序设计公开赛 / 1002 Fruit Ninja



某神的代码:

#include<stdio.h>
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
const int inf=0x7fffffff;

struct node      // Fruit
{
    int adv;
    int x[11],y[11];     
}Fruit[11];

int Fruit_num,ans;

//----
int  judge( int x1,int y1,int x2,int y2,int x,int y )
{
     return ( ( x1-x )*( y2-y ) - ( x2-x )*( y1-y ) );        
}
bool on_megment( int x1,int y1,int x2,int y2,int x3,int y3 )
{
     int t1=x1-x3;
     int t2=y1-y3;
     int t3=x1-x2;
     int t4=y1-y2;
     if( ( t1*t4-t2*t3 )==0 )
       return true;
     else return false;
}
bool megment( int x1,int y1,int x2,int y2,int p1,int q1,int p2,int q2 )
{
     if( on_megment( p1,q1,p2,q2,x1,y1 )|| on_megment( p1,q1,p2,q2,x2,y2 ) )
         return true;
    int d1=judge( p1,q1,p2,q2,x1,y1 );
    int d2=judge( p1,q1,p2,q2,x2,y2 );
    if( d1*d2<0 )  return true;
    return false;
}

 //---
 /*
bool megment1( int p1,int q1,int p2,int q2, int x1,int y1,int x2,int y2 )
{
     if ( x1 != x2 ) // k exsit
     {
         double a =  (y1-y2)/(x1-x2);
         double b =  y1;
         if( a*p1+b < q1 && a*p2+b < q2 || a*p1+b > q1 && a*p2+b > q2 )   
             return false;
         return true;  
     }     
     else
     {
         if( p1 > x1 && p2 > x2 || p1 < x1 && p2 < x2)    
             return false;
         return true;
     }
}*/
void getFruit()
{
     for(int i = 1; i <= Fruit_num; ++i )
     {
         scanf("%d",&(Fruit[i].adv) );   
         for(int j = 1; j <= Fruit[i].adv; ++j )
         {
             scanf("%d%d",&(Fruit[i].x[j]),&(Fruit[i].y[j]));     
         }     
     }     
}

void Search()
{
     for(int i = 1; i <= Fruit_num; ++i )                     // 选取任意两个水果         
         for( int j = i+1; j <= Fruit_num; ++j )
         {
              for(int a = 1; a <= Fruit[i].adv; ++a )           //第一个水果顶点
              {   
                  for(int b = 1; b <= Fruit[j].adv; ++b )       //第二个水果顶点  作为直线 
                  {
                      int x1 = Fruit[i].x[a], y1 = Fruit[i].y[a];
                      int x2 = Fruit[j].x[b], y2 = Fruit[j].y[b]; 
                      int cut_num = 2;
                      for( int c = 1; c <= Fruit_num; ++c )    //对剩余的水果进行枚举比较 
                      {
                           if( c == i || c == j ) continue;    
                           
                           bool flag = false;
                           int d;
                           for( d = 1; d < Fruit[c].adv; ++d )//选取相邻两顶点                        
                           {
                                if(flag) continue;
                                if( megment(Fruit[c].x[d],Fruit[c].y[d],Fruit[c].x[d+1],Fruit[c].y[d+1] ,x1,y1,x2,y2 )  )
                                    flag = true;   
                           }
                           if( megment(Fruit[c].x[d],Fruit[c].y[d],Fruit[c].x[1],Fruit[c].y[1],x1,y1,x2,y2 ) )
                                    flag = true;  
                           if(flag) cut_num++;
                      }
                      ans = max(ans,cut_num);
                  }
              }
         }
}

int main()
{
    int t, Case = 1;
    scanf("%d",&t);
    while(t--)
    {
          scanf("%d",&Fruit_num);  
          getFruit();          //Input the Fruit.
          
          ans = 0;
          Search();            //Search the Max numbers of Fruit.
          
          if( Fruit_num == 1 ) 
                printf("Case %d: %d\n",Case++,1);
          else
                printf("Case %d: %d\n",Case++,ans);
    }    
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值