poj 4022 ASCII Area dfs求二维面积 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    题意:

    给一个有'/','\','.'组成的二维字符数组,求图中‘/’和‘\’组成的面积有多大,

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>

最新文章