题意:
给一个有‘/‘,‘\‘,‘.‘组成的二维字符数组,求图中‘/’和‘\’组成的面积有多大。
分析:
每个‘/’和‘\’的格每个贡献1/2的面积,每个多边形内部的‘.‘贡献1的面积,关键是求多边形内部的’.‘有多少个。一开始往上下左右4个方向搜wa了,原来内部的点可以斜着扩展,比如/./这种情况。但斜着搜要注意避免从多边形内部跑到外部的情况,比如题目中给的sample。
代码:
//poj 4022 //sep9 #include <iostream> using namespace std; const int maxN=128; int h,w,ans; char g[maxN][maxN]; int vis[maxN][maxN]; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int ddx[4]={-1,1,1,-1}; int ddy[4]={1,-1,1,-1}; int dfs(int i,int j) { vis[i][j]=1; int s=1; for(int k=0;k<4;++k){ int nx=i+dx[k]; int ny=j+dy[k]; if(nx<0||nx>=h||ny<0||ny>=w) return -1; if(g[nx][ny]=='.'&&vis[nx][ny]==-1){ int t=dfs(nx,ny); if(t==-1) return -1; s+=t; } } for(int k=0;k<4;++k){ int nx=i+ddx[k]; int ny=j+ddy[k]; if(nx<0||nx>=h||ny<0||ny>=w) return -1; int minx=min(nx,i); int miny=min(ny,j); int maxx=max(nx,i); int maxy=max(ny,j); if((minx==nx&&miny==ny)||(minx==i&&miny==j)) if(g[minx][miny+1]=='/') continue; if((minx==nx&&maxy==ny)||(minx==i&&maxy==j)) if(g[minx][miny]=='\\') continue; if(g[nx][ny]=='.'&&vis[nx][ny]==-1){ int t=dfs(nx,ny); if(t==-1) return -1; s+=t; } } return s; } int main() { scanf("%d%d",&h,&w); for(int i=0;i<h;++i) scanf("%s",g[i]); memset(vis,-1,sizeof(vis)); int sum=0,ans=0; for(int i=0;i<h;++i) for(int j=0;j<w;++j){ if(g[i][j]=='/'||g[i][j]=='\\') ++sum; else if(vis[i][j]==-1) ans=max(ans,dfs(i,j)); } printf("%d",sum/2+ans); return 0; }
时间: 2024-11-05 06:04:06