大概就是給你若干個點描述乙個軌跡,這個軌跡的終點一定是和起點重合的
然後問你分成了幾個平面區域
這個問題用到了尤拉定理,妙啊!
平面圖的尤拉定理(不得不說尤拉牛逼啊)
e是稜的個數,其實可以理解成邊,f是區域的個數,這裡理解為邊劃分成的區域,e是頂點,也就是圖論中的頂點。
至於什麼是平面圖,不解釋了
然後**的細節處理也要關注
1.頂點個數的考量
當然給定的這個軌跡可能有自己和自己相交,所以列舉一遍所有的線段,然後n^2求交點即可,
當然交點有可能被算了若干次,這裡使用unique除去多餘的就行,注意精度判斷問題啊!!!
點有了,那麼稜到底有多少個呢
雖然我們開始的時候搞了多餘的點,但是開始一筆畫的筆畫數還是知道的,就是n-1
但是,這裡的稜不是線段,如果三點共線當然是要算兩條稜的
又到了喜聞樂見的列舉時間了,
其實也很簡單,把加進來的頂點挨個詢問一遍是不是在已經有的這些筆畫上面,如果有的話就是乙個三點共線,那麼把稜數加一就行
這樣子是不會重複計數的
最後解方程,小學知識咯
順便說一下unique的使用,要先sort,然後就知道了
unique使用的時候也是像sort一樣指定起止
1const
int maxn=405;2
intn;
3 point p[maxn],v[maxn*maxn];//
v是交點的數量(交點也算頂點啊歪歪歪!)4//
p是頂點的數量
5int
cas;
6void
solve()
713 n=n-1;14
int c=n,e=n;
15for(int i=0;i)
16for(int j=i+1;j)
1723
}24 sort(v,v+c);
25 c=unique(v,v+c)-v;
26for(int i=0;i)
27for(int j=0;j)
2832 printf("
case %d: there are %d pieces.\n
",++cas,e+2-c);
33return;34
}35intmain()
3644
//while(1);
45return0;
46 }
LA 3263 尤拉定理
include include includeusing namespace std const double eps 1e 10 int dcmp double x struct point typedef point vector vector operator const vector a,c...
LA 3263 尤拉定理
include include include include include include using namespace std const int maxn 310 const int maxe 100000 const int inf 0x3f3f3f struct point 建構函式 ...
LA 3263 計算幾何,尤拉定理
題目大意 有n個點組成的一筆畫,問這個圖形把平面分成了幾個部分 題目解析 先把那些直線相交得出的點算出來得出點數,再把 邊數算出來,有乙個點在原來的線段上並且不與端點重合邊數就加一,因為一條線段變成了兩條線段,最後根據尤拉定理f e 2 v算出面數 ac includeusing namespace...