题目描述
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。
多边形被放置在一个 X-YX−Y 的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入输出格式
输入格式:
第一行给出多边形的顶点数 n(n≤100)n(n≤100) 。接下来的几行每行给出多边形一个顶点的坐标值 XX 和 YY (都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值 -200≤x,y≤200−200≤x,y≤200 。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出格式:
一个整数,表示多边形的面积。
输入输出样例
输入样例#1: 复制
10
0 0
4 0
4 1
3 1
3 3
2 3
2 2
1 2
1 3
0 3
输出样例#1: 复制
9
思路:皮克公式 +搜索。
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 110 using namespace std; int n,ans,bns; int map[501][501]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; struct nond{ int x,y; }point[MAXN]; void dfs(int x,int y){ if(x>400||x<0||y>400||y<0||map[x][y]!=0) return ; map[x][y]=1;ans++; dfs(x+1,y);dfs(x-1,y); dfs(x,y+1);dfs(x,y-1); } int main(){ scanf("%d",&n); point[0].x=-1;point[0].y=-1; for(int i=1;i<=n+1;i++){ if(i<=n){ scanf("%d%d",&point[i].x,&point[i].y); point[i].x+=200;point[i].y+=200;bns++; } if(i==1){ point[n+1].x=point[1].x; point[n+1].y=point[1].y; } if(point[i].x==point[i-1].x){ int mi=min(point[i].y,point[i-1].y); int ma=max(point[i].y,point[i-1].y); for(int j=mi;j<=ma;j++) map[point[i].x][j]=1; bns+=ma-mi-1; } else if(point[i].y==point[i-1].y){ int mi=min(point[i].x,point[i-1].x); int ma=max(point[i].x,point[i-1].x); for(int j=mi;j<=ma;j++) map[j][point[i].y]=1; bns+=ma-mi-1; } } dfs(point[1].x+1,point[1].y+1); cout<<ans+bns/2-1; }