2011阿里巴巴程序设计公开赛 / 1002 Fruit Ninja
生活随笔
收集整理的這篇文章主要介紹了
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);elseprintf("Case %d: %d\n",Case++,ans);} return 0; }轉載于:https://www.cnblogs.com/tclh123/archive/2011/08/18/2587078.html
總結
以上是生活随笔為你收集整理的2011阿里巴巴程序设计公开赛 / 1002 Fruit Ninja的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到被黑蛇追着跑预示着什么
- 下一篇: 16、常用shell命令方法