【POJ1654】Area【叉積】
阿新 • • 發佈:2019-01-05
題目大意:
題目連結:http://poj.org/problem?id=1654
根據特殊的讀入方式得到一個多邊形,求這個多邊形的面積。
思路:
求平面直角座標系中多邊形面積模板題。
設上一個頂點的座標為
,這一個頂點的面積座標為
。那麼以
三點組成的三角形面積就是
兩點的叉積的一半。
根據容斥原理,易得該多邊形面積就是所有三角形的面積和的絕對值。
程式碼:
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1000010;
const ll dx[]={0,1,1,1,0,0,0,-1,-1,-1};
const ll dy[]={0,-1,0,1,-1,0,1,-1,0,1};
int Q,i;
ll ans,x1,x2,y1,y2;
int main()
{
scanf("%d",&Q);
while (Q--)
{
x1=y1=ans=0;
while (scanf("%1d",&i)==1&&i!=5)
{
x2=x1+dx[i];
y2=y1+dy[i];
ans+=(x1*y2-x2*y1); //叉積
x1=x2;
y1=y2;
}
if (ans<0) ans=-ans;
if (ans&1) printf("%lld.5\n",ans/2);
else printf("%lld\n",ans/2);
}
return 0;
}
注意事項
-
首先 會 , 會 ,不要用這兩個編譯器。可以使用
-
最終答案是要取絕對值,但 用 居然會 ,所以要手寫 。
-
因為答案一定是整數或整數除以二,所以用整形存,不能用 或 。
-
還有答案可能爆 ,所以要開 。
-
最坑的是不能所有的變數都開,會 ,所以只開跟答案相關的就行。
摘自本題討論,同時感謝討論的第一點和第二點救了我。