BNU - Truchet Tiling-搜索
来源:互联网 发布:网络监控水晶头接法图 编辑:程序博客网 时间:2024/06/11 14:24
题意:
给你一个图案,让你输出图案的相连面积。
解:
这题就是表示比较麻烦的。就是个bfs或者dfs搜索,方向标记麻烦一点。看着倪裕芳敲完的,于是我决定不敲了。
#include <iostream>#include <cstdio>#include<queue>#include <cstring>#include<cmath>#include <algorithm>#include <iostream>const double PI=acos(-1)/4.0;const double eps=1e-8;using namespace std;int m,n,Q;int grid[101][101], map[444][444];int dir[4][2]={{0,0},{0,1},{1,1},{1,0}};int dir2[4][2]={{-1,0},{0,1},{1,0},{0,-1}};int vis[433][433];void init(){ for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(grid[i][j]==1) { map[i*2][j*2]=0; map[i*2-1][j*2]=2; map[i*2][j*2-1]=-2; map[i*2-1][j*2-1]=0; } else { map[i*2][j*2]=-1; map[i*2-1][j*2]=0; map[i*2][j*2-1]=0; map[i*2-1][j*2-1]=1; } } }}bool check(int x,int y){ if(x<=0||y<=0||x>2*m||y>2*n||vis[x][y])return false; return true;}void dfs(int u,int v,int f,double &ans){ vis[u][v]=1; if(map[u][v]!=0) { if(map[u][v]==1) { if(f==0) { ans+=1-PI; if(check(u,v+1)) dfs(u,v+1,1,ans); } else if(f==1) { ans+=PI; if(check(u-1,v)) dfs(u-1,v,0,ans); } else if(f==2) { ans+=PI; if(check(u,v-1)) dfs(u,v-1,3,ans); } else if(f==3) { ans+=1-PI; if(check(u+1,v)) dfs(u+1,v,2,ans); } } else if(map[u][v]==-1) { if(f==0) { ans+=PI; if(check(u,v+1)) dfs(u,v+1,1,ans); } else if(f==1) { ans+=1-PI; if(check(u-1,v)) dfs(u-1,v,0,ans); } else if(f==2) { ans+=1-PI; if(check(u,v-1)) dfs(u,v-1,3,ans); } else if(f==3) { ans+=PI; if(check(u+1,v)) dfs(u+1,v,2,ans); } } else if(map[u][v]==2) { if(f==0) { ans+=1-PI; if(check(u,v-1)) dfs(u,v-1,3,ans); } else if(f==1) { ans+=1-PI; if(check(u+1,v)) dfs(u+1,v,2,ans); } else if(f==2) { ans+=PI; if(check(u,v+1)) dfs(u,v+1,1,ans); } else if(f==3) { ans+=PI; if(check(u-1,v)) dfs(u-1,v,0,ans); } } else if(map[u][v]==-2) { if(f==0) { ans+=PI; if(check(u,v-1)) dfs(u,v-1,3,ans); } else if(f==1) { ans+=PI; if(check(u+1,v)) dfs(u+1,v,2,ans); } else if(f==2) { ans+=1-PI; if(check(u,v+1)) dfs(u,v+1,1,ans); } else if(f==3) { ans+=1-PI; if(check(u-1,v)) dfs(u-1,v,0,ans); } } return; } ans+=1.0; int x,y; for(int i=0;i<4;i++) { x=u+dir2[i][0]; y=v+dir2[i][1]; if(check(x,y)) { dfs(x,y,i,ans); } }}void solve(int x,int y){ int u,v,flag=0; double ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<4;i++) { u=x+dir[i][0]; v=y+dir[i][1]; if(u<=0||u>2*m)continue; if(v<=0||v>2*n)continue; if(i%2==0&&abs(map[u][v])==2)flag=1; if(i%2==1&&abs(map[u][v])==1)flag=1; if(flag)break; if(check(u,v)) { dfs(u,v,i,ans); } } if(flag)puts("0.0000"); else printf("%.4lf\n",ans+eps);}char str[140];int main(){ int T,a,b; scanf("%d",&T); for(int ca=1;ca<=T;ca++) { printf("Case %d:\n",ca); scanf("%d%d\n",&m,&n); for(int i=1;i<=m;i++) { scanf("%s",str+1); for(int j=1;j<=n;j++) { grid[i][j]=str[j]-'0'; } } init(); scanf("%d",&Q); while(Q--) { scanf("%d%d",&a,&b); solve(a,b); } } return 0;}
- BNU - Truchet Tiling-搜索
- BNU Graceful Prime Decomposition 记忆化搜索
- BNU - Dividing Stones 记忆化搜索
- BNU
- Tiling
- Tiling
- Tiling
- Tiling
- Tiling
- Tiling
- Tiling
- BNU 26582Gregory the Grasshopper 搜索水题
- poj 1609 Tiling Up Blocks dp入门之记忆化搜索
- BNU 1042
- BNU 12883
- BNU 16225
- bnu 4067
- BNU 1065
- PVCBOT【8号】逐日知了--太阳能追光小车
- 黑马程序员十、交通灯管理系统
- 无法显示 XML 页.名称以无效字符开头。处理资源 'http://localhost/' 时出错。第 1 行,位置: 2
- 深入了解WM_SIZE
- OCM备考 一、Server config 之管理表空间
- BNU - Truchet Tiling-搜索
- OCM备考 一、Server config 之配置shared server
- C++ - 区分new的三种形态
- OCM备考 一、Server config 之网络配置
- 《设计原本》摘记:
- 收藏一些qq面试题
- PVCBOT【9号C版】忐忑者--自平衡双轮小车
- Maven && ssh
- 在wxwidgets 界面编程使用 png 图片