题意:
给一个有'/','\','.'组成的二维字符数组,求图中‘/’和‘\’组成的面积有多大,
poj 4022 ASCII Area dfs求二维面积
。分析:
每个‘/’和‘\’的格每个贡献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) ans="max(ans,dfs(i,j));" else="" i="0;i<h;++i)" int="" j="0;j<w;++j){" pre="" return="" sum=""></p></h;++i)></iostream>