首页 > 代码库 > 青岛理工ACM交流赛 J题 数格子算面积

青岛理工ACM交流赛 J题 数格子算面积

 

数格子算面积

 

Time Limit: 1000MS Memory limit: 262144K

题目描述

给你一个多边形(\’/’表示多边形的边),求多边形的面积

输入

 第一行两个正整数 w (2 ≤ h, w ≤ 100),h是多边形所在平面的高,w是多边形所在平面的宽,接下来h,每行w个字符,描述了整个平面的每个单元(每个单元是一个单位面积),字符只会是\’,’/’.’其中之一,’\’,’/’表示多边形的边,’.’表示空白单元

输出

 输出一个数,输入代表的平面内多边形的单位面积

示例输入

4 4/\/\../.\...\/

示例输出

8

提示

 

来源

青岛理工交流赛
 
 
     算法分析:一开始以为此题目不简单,但经过仔细分析后原来是道水题!
                 对于初始的图案,要么是 图形外,要么是图形内! 而我们要计算的是 图形内的面积。
                 (1)如果该行 全是‘.’的图案,说明这行绝对没在图形内。
                 (2)对于当前的这行,从左边是开始找到一个‘/’ 或者‘\’的字符, 说明这是 图形在该行的边。 同理在该行再从 右边往左找到一个‘/’ 或者 ‘\’ 的字符。  说明这是在该行上的右边的边。 只要把每行上的这样的面积累加就是最后的总面积。
                 (3)‘/’ 和‘\’的字符对总面积的贡献是 半个, 而字符‘.’ 对总面积的贡献是 1个。

/\/\ // 对于该行第一字符就是‘/’,说明这是左边,第四个字符‘\’是右边, 该行的面积是:半个+半个+半个+半个\../ // 该行的面积是:半个+1个+1个+半个.\.\ // 该行的面积是:0 + 半个+1个+半个 ..\/ // 该行的面积是:0 + 0 +半个+半个

(4)最后边个的总数别忘了除2 !

代码如下:
#include <iostream>#include <string>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char map[200][200];int main(){    int n, m;    int i, j, k;    int dd;    int bn, zh, area;    while(scanf("%d %d", &n, &m)!=EOF)    {        for(i=0; i<n; i++)        {            scanf("%s", map[i] );        }        bn=0;        zh=0;        area=0;        for(i=0; i<n; i++)        {            j=0;            while(map[i][j]==‘.‘ && j<m )            {                j++;            }            if(j==m-1)            {                continue;            }            dd=m-1;            while(map[i][dd]==‘.‘ && dd>=0 )            {                dd--;            }            for(k=j; k<=dd; k++)            {                if(map[i][k]==47 || map[i][k]==92 )                {                    bn++;                }                else                {                    zh++;                }            }        }        area=bn/2+zh;        cout<<area<<endl;    }    return 0;}

  

  

青岛理工ACM交流赛 J题 数格子算面积