菱形内的计数

来源:互联网 发布:应聘软件测试自我介绍 编辑:程序博客网 时间:2024/05/16 12:41

Description

  教主上电视了!这个消息绝对是一个爆炸性的新闻。一经传开,大街上瞬间就没人了(都回家看电视去了),商店打烊,工厂停业。大家都把电视机的音量开到最大,教主的声音回响在大街小巷。
  小L给小X慌乱地打开自己家的电视机,发现所有频道都播放的是教主的采访节目(-_-bbb)。只见电视屏幕上的教主笑意吟吟,给大家出了一道难题:
  一个边长为n的大菱形被均匀地划分成了n*n个边长为1的小菱形组成的网格,但是网格中部分边被抹去了,小L想知道,大菱形内有多少个平行四边形,这些平行四边形内不存在边。
  教主说,如果谁写出了程序,移动用户请将程序发送到xxxx,联通用户请将程序发送到xxxx……如果答对这个题,将有机会参加抽奖,大奖将是教主签名的Orz教主T-Shirt一件!这个奖品太具有诱惑力了。于是你需要编一个程序完成这么一道题。

Input

  输入的第1行为一个正整数n,为大菱形的边长。
  以下2n行,每行2n个字符,字符为空格,“/”,“\”中的一个。
  前n行,第i行中居中有2i个字符,这2i个字符中位置为奇数的字符只可能为“/”或者空格,位置为偶数的字符只可能为“\”或空格,若为空格表示这样一条边不存在,其余字符均为空格,描述了大菱形的上半部分。
  后n行,第i行居中有有2(n-i+1)个字符,与上半部分类似地描述了菱形的下半部分
  输入文件保证大菱形的轮廓上没有边被抹去。

Output

  输出仅包括一个整数,为满足要求的平行四边形个数。

Sample Input

3
/\
/\/\
/ /\ \
\/\ /
\ \/
\/
(这个比较奇怪我也没办法调,前面和后面都是有空格的)

Sample Output

3

Data Constraint

对于20%的数据,n≤10;
对于40%的数据,n≤60;
对于60%的数据,n≤200;
对于100%的数据,n≤888。

Solution

这题一种简单的想法就是把图强行掰弯,然后变成正方形,对于正方形的每个格,记录上下左右是否右边,直接遍历就行了
但是有一种特殊情况没考虑导致我此题爆炸
就是如果一个菱形完全包围了另一个菱形,我的判断就出错了
然后就丢了80分

Code

#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 900using namespace std;int n,q[N*2][N*2][2],s[N][N],a[N][N][4],ans=0,bz[N][N];void pd(int x,int y){    int x1=x,y1=y;    for(;a[x][y1][1]!=1&&y1<n;y1++);    for(;a[x1][y1][2]!=1&&x1<n;x1++);    int bz1=1,jy=0;    fo(i,y,y1)     {        if(a[x][i][0]==0||a[x1][i][2]==0) bz1=0;    }    fo(i,x,x1)    {        if(a[i][y][3]==0||a[i][y1][1]==0) bz1=0;    }    if((s[x1][y1]-s[x-1][y1]-s[x1][y-1]+s[x-1][y-1])!=2*(x1-x+1+y1-y+1)) bz1=0;    if(bz1) ans++;}int main(){    scanf("%d\n",&n);    fo(i,1,n)    {        int x=i,y=n-i+1;        fo(j,1,n) q[x][y][0]=i,q[x][y][1]=j,x++,y++;    }    int jy=1;    fo(i,1,2*n)    {        fo(j,n-jy+1,n+jy)        {            int ch;ch=getchar();            if(ch==32) continue;            if(ch==47)            {                int x=q[i][j][0],y=q[i][j][1];                if(y>0) s[x][y]++,a[x][y][3]=1;                x=q[i-1][j-1][0],y=q[i-1][j-1][1];                if(y<=n) s[x][y]++,a[x][y][1]=1;            }            else            {                int x=q[i-1][j][0],y=q[i-1][j][1];                if(x<=n) s[x][y]++,a[x][y][2]=1;                x=q[i][j-1][0],y=q[i][j-1][1];                if(x>0) s[x][y]++,a[x][y][0]=1;            }        }        scanf("\n");        if(i<n) jy++;else jy--;        if(i==n) jy++;    }    fo(i,1,n) fo(j,1,n) s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];    fo(i,1,n) fo(j,1,n)     if(!bz[i][j]) pd(i,j);    printf("%d",ans);}
1 0
原创粉丝点击