菱形内的计数
来源:互联网 发布:应聘软件测试自我介绍 编辑:程序博客网 时间: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);}
- 菱形内的计数
- 菱形内的计数 jzoj 1404 模拟+递推
- 2017.04.15【NOIP2017提高组】模拟赛B组 T3:菱形内的计数
- 正方形内的计数
- JZOJ1332. 正方形内的计数
- 数据流挖掘——窗口内的计数问题
- 使用AOP实现iOS应用内的埋点计数
- 控制台文字矩阵、菱形排列(充分展示用逻辑替代内循环的处理技巧)
- “*”组成的菱形与空心菱形
- 菱形的一种算法
- 中空的菱形
- 菱形的输出
- java写的菱形
- 图形的打法。。。{菱形}
- 打印菱形的心得
- 输出菱形的算法!
- 可选择的菱形代码
- 打印菱形的程序
- 函数指针
- JEECG 版本更新日志
- 克隆二叉树
- 【disconf】环境搭建
- HashMap与HashTable
- 菱形内的计数
- 第二届蓝桥杯 中奖计算
- SharedPreferences.getInt() 出现ClassCastException错误
- 二叉树的路径和
- vi文本编辑器
- 部署javaweb到云服务器上
- 最小化安装centos7.3+redmine3.3.3+passenger
- FFmpeg 命令行推流 传视频到组播①
- listview 加标题