1. 程式人生 > >【POJ1654】Area【叉積】

【POJ1654】Area【叉積】

題目大意:

題目連結:http://poj.org/problem?id=1654
根據特殊的讀入方式得到一個多邊形,求這個多邊形的面積。


思路:

建議先看下文注意事項,謝謝!

求平面直角座標系中多邊形面積模板題。
設上一個頂點的座標為 ( x 1 , y 1 ) (x1,y1)
,這一個頂點的面積座標為 ( x 2 , y 2 ) (x2,y2) 。那麼以 ( 0 , 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (0,0),(x1,y1),(x2,y2) 三點組成的三角形面積就是 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x1,y1),(x2,y2) 兩點的叉積的一半。
根據容斥原理,易得該多邊形面積就是所有三角形的面積和的絕對值。


程式碼:

#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;
}

注意事項

  • 首先 G C C GCC c e ce G + + G++ w a wa ,不要用這兩個編譯器。可以使用 C + + C++

  • 最終答案是要取絕對值,但 f a b s fabs c + + c++ 居然會 c e ce ,所以要手寫 a b s abs

  • 因為答案一定是整數或整數除以二,所以用整形存,不能用 f l o a t float d o u b l e double

  • 還有答案可能爆 i n t int ,所以要開 l o n g   l o n g long\ long

  • 最坑的是不能所有的變數都開,會 M L E MLE ,所以只開跟答案相關的就行。

摘自本題討論,同時感謝討論的第一點和第二點救了我。