程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1654 Area(任意多邊形面積)

POJ 1654 Area(任意多邊形面積)

編輯:C++入門知識

題目:從一個點出發,8個方向,給出每一步的方向,求出走過的路徑形成的多邊形的面積。不過題目說了會首尾 其實利用向量叉積求解多邊形面積,也不只是適用於凸邊形。出現凹的部分,剛好一正一負,抵消了。
不過這題討厭的是精度。
double是不能過的,必須要用整數,又不能溢出,用64位整數,輸出的時候面積只需要除以2,所以只需要判斷奇偶。。。。。啊啊啊WA好多次不只因為精度,八個方向對應的坐標變化錯了好幾次,東西不分啊
[cpp] 
#include<iostream> 
#include<cstdio> 
#include<cstring> 
#include<cmath> 
#include<vector> 
#include<string> 
#include<algorithm> 
#include<queue> 
#define LL __int64 
#define eps 1e-7 
#define N 2000000 
#define MOD 1000000007 
#define inf 1<<30 
#define zero(a) (fabs((double)(a))<eps) 
using namespace std; 
struct Point{ 
    int x,y; 
}p[1000005]; 
int n; 
int way[9][2]={1,-1,1,0,1,1,0,-1,0,0,0,1,-1,-1,-1,0,-1,1}; 
LL xmul(Point p0,Point p1,Point p2){ 
    return (LL)(p1.x-p0.x)*(p2.y-p0.y)-(LL)(p2.x-p0.x)*(p1.y-p0.y); 

LL area(){ 
    LL ans=0; 
    for(int i=1;i<=n;i++) 
        ans+=xmul(p[0],p[i],p[i+1]); 
    return ans<0?-ans:ans; 

char str[1000005]; 
int main(){ 
    int t; 
    scanf("%d",&t); 
    while(t--){ 
        scanf("%s",str); 
        p[0].x=0;p[0].y=0; 
        for(n=0;str[n+1];n++){ 
            int dir=str[n]-'1'; 
            p[n+1].x=p[n].x+way[dir][0]; 
            p[n+1].y=p[n].y+way[dir][1]; 
        } 
        LL ans=area(); 
        if(ans%2==0) printf("%I64d\n",ans/2); 
        else printf("%I64d.5\n",ans/2); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved