SSL2787 2017年10月24日提高组 一个不成熟的想法(dfs)
2017-10-24 19:12
274 查看
2017年10月24日提高组 一个不成熟的想法
DescriptionYmw因为十分厉害,刷题已经不能满足他了,他想去写一个小程序来实现一些功能,现在有一个2N*2M的矩形水池,被一些宽度不计的隔板所隔开,每个2*2的小矩形中都有两块弧形隔板,且只有可能是这两种图案中的一种:
现在你看到了ymw的水池的样子,ymw有Q个问题,每次想知道如果在(x,y)上倒了一同染料,则最终可以扩散多大的面积?
Input
Output
分析:显然可得染料在每个矩形中的扩散只有四种情况,即从4个顶点开始扩散,这样两种图案就有8种,dfs一下就好啦。
代码
#include <cstdio> #include <cstring> #include <string> #include <iostream> #define maxn 500 #define pi 3.141592653589793 using namespace std; int a[maxn][maxn],n,m; double ans; bool f[maxn][maxn],v[maxn][maxn][5]; bool check(int x,int y,int tmp) { if (x<0||x>n-1||y<0||y>m-1) return false; if (a[x][y]==0) { if (tmp==1||tmp==4) if (v[x][y][tmp]) return false; if (tmp==2||tmp==3) if (v[x][y][2]||v[x][y][3]) return false; } else { if (tmp==2||tmp==3) if (v[x][y][tmp]) return false; if (tmp==1||tmp==4) if (v[x][y][1]||v[x][y][4]) return false; } return true; } void dfs(int x,int y,int tmp) { if (!check(x,y,tmp)) return; v[x][y][tmp]=true; if (a[x][y]==0) { if (tmp==1) { ans+=pi/4; return; } if (tmp==2) { ans+=4-pi/2; dfs(x,y-1,4); dfs(x+1,y,1); dfs(x+1,y-1,2); } if (tmp==3) { ans+=4-pi/2; dfs(x-1,y,4); dfs(x,y+1,1); dfs(x-1,y+1,3); } if (tmp==4) { ans+=pi/4; return; } } else { if (tmp==1) { ans+=4-pi/2; dfs(x+1,y,2); dfs(x,y+1,3); dfs(x+1,y+1,1); } if (tmp==2) { ans+=pi/4; return; } if (tmp==3) { ans+=pi/4; return; } if (tmp==4) { ans+=4-pi/2; dfs(x,y-1,2); dfs(x-1,y,3); dfs(x-1,y-1,4); } } } int main() { scanf("%d%d",&n,&m); for (int ii=0;ii<=n-1;ii++) for (int jj=0;jj<=m-1;jj++) { char ch; cin>>ch; a[ii][jj]=ch-'0'; int i=ii; int j=jj; if (ch=='0') { f[i*2][j*2+1]=true; f[i*2+1][j*2]=true; f[(i+1)*2][j*2+1]=true; f[i*2+1][(j+1)*2]=true; } else { f[i*2][j*2+1]=true; f[i*2+1][(j+1)*2]=true; f[i*2+1][j*2]=true; f[(i+1)*2][j*2+1]=true; } } int q; scanf("%d",&q); for (int i=1;i<=q;i++) { int x,y; scanf("%d%d",&x,&y); memset(v,false,sizeof(v)); if (f[x][y]) printf("0.0000\n"); else { if (x%2==1&&y%2==1) { x/=2; y/=2; if (a[x][y]==1) { ans=4-pi/2; v[x][y][1]=true; dfs(x-1,y-1,4); dfs(x,y-1,2); dfs(x-1,y,3); dfs(x+1,y,2); dfs(x,y+1,3); dfs(x+1,y+1,1); } else { ans=4-pi/2; v[x][y][2]=true; dfs(x-1,y,4); dfs(x,y+1,1); dfs(x-1,y+1,3); dfs(x+1,y,1); dfs(x+1,y-1,2); dfs(x,y-1,4); } } else { x/=2; y/=2; dfs(x,y,1); dfs(x-1,y,3); dfs(x-1,y-1,4); dfs(x,y-1,2); } printf("%.4f\n",ans); ans=0; } } }
相关文章推荐
- SSL2703 2017年8月16日提高组T2 疾病(dfs)
- 复习 dfs 一个有待提高的版本 17. Letter Combinations of a Phone Number
- 建设一个可以缓解人们压力的“挨踢”网的不成熟想法
- SSL2668 2017年8月7日提高组T1 根(dfs)
- 挖地雷_1996年分区联赛提高组之三_ssl1071_dfs
- 一个“成熟的”的想法
- 【SSLGZ 2788】2017年10月24日提高组 想法的升级
- SSL2675 2017年8月9日提高组T3 难题(dfs)
- 转载 一个cms系统的想法
- 【POJ 3321】【dfs序(讲解)+(树状数组或者线段树)】Apple Tree【给你一颗树,最初每个节点上都有一个苹果,有两种操作单点修改和查询子树的苹果个数】
- 恩恩,一个想法,初步实现了它~就剩封装了
- 10个方法提高编程生产力--一个优秀程序
- 测试一个网站的想法
- 一个开源工作者对开源与赚钱的一些想法
- 一个有想法的程序员(职业精神)
- DFS——[ 2000Noip提高组第三题 ]单词接龙
- 做一个美女图片大全那种的网站怎么提高网站流量?
- 分享一个链接,MS官方的解释:关于网络上流传的通过修改组策略“解除XP/WIN7系统默认限制20%的网速”来提高网速的问题。希望大家不要被误导。
- Codeforces Round #370 (Div. 2) C. Memory and De-Evolution【dfs+想法】
- 软件行业的一个发展推力就是不断提高用来构造软件的基础元素,也就是所谓的编程模型