当前位置: 代码迷 >> 综合 >> poj 4022 ASCII Area dfs求二维面积
  详细解决方案

poj 4022 ASCII Area dfs求二维面积

热度:17   发布时间:2024-01-19 05:47:33.0

 题意:

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

分析:

每个‘/’和‘\’的格每个贡献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;	
} 


  相关解决方案