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)
		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-08-26 22:08:45

poj 4022 ASCII Area dfs求二维面积的相关文章

UVA 1641 POJ 4022 ASCII Area

统计斜杠出现了奇数次还是偶数次 点击打开链接 Long time ago, most of PCs were equipped with video cards that worked only in text mode. If theprogrammer wanted to show a picture on a screen, he had to use pseudographics or ASCII art like this:^..^(OO)/ \()()In this problem

结对开发(求二维首尾相接数组的最大子数组和)

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二

求二维数组中子数组和中最大的值,及子数组

求二维数组中子数组和中最大的值,及子数组 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 每次着急写程序,碰到问题就头疼,头疼之后便是满满的收获,付出总有回报. 题目 求

软件工程结对开发之求二维数组中连续最大子数组之和2

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 先调用以前求二维最大连续子数组之和的maxSubArray函数求一个首尾不相邻的二维最大连续子数组之和,接着用将第k列各元素左移一列可以再求一个最大连续子数组之和 ,循环m次(因为原二维数组有m列)求得每个

结对开发——求二维环形数组所有子矩阵最大和的问题

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.

poj 2155 二进制0 1反转---二维树状数组

http://poj.org/problem?id=2155 上午自己搞了很久胡思乱想了很久,然后没思路-----看了论文<浅谈信息学竞赛中的"0"和"1"--二进制思想在信息学竞赛中的应用>,豁然开朗啊,,马上A掉---PE了一次o(╯□╰)o 通过论文学到的两点: 1.多维不会的时候,从一维尝试类比: 2.想法的证明,情况数不多的时候,分类讨论证明很好 #include <cstdio> #include <cstring>

求二维数组中最大子数组的和

一.题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二:结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三:设计思路: 将二维数组的每行轮番逐次相加(包括单行)后看成一维数组,利用求

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

使用Graham扫描法求二维凸包的一个程序

1 #include "includeall.h" 2 #include "Link.class.h" 3 4 int RightOrLeft(float x1,float y1,float x2,float y2,float x3,float y3)//判断第三个点在前两个点连成的直线的哪个位置,-1 左边,0,直线上,1 右边 5 { 6 float X=(y3-y1)*(x2-x1)/(y2-y1)+x1; 7 if(X<x3) 8 { 9 return