【jzoj4777】【灌水】【搜索】

来源:互联网 发布:编程书 编辑:程序博客网 时间:2024/06/05 04:25

题目大意

这里写图片描述

解题思路

显然暴力模拟,我是一块一块(2*2)考虑的,注意一块有四个访问标记即一个块的不同部分都有可能被访问到。

code

#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define max(a,b) ((a>b)?a:b)#define min(a,b) ((a>b)?b:a)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=100,inf=2147483647;int n,m,q,map[maxn+10][maxn+10],vis[maxn+10][maxn+10][10];double ans,pi=3.1415926535897;void dfs(int i,int j,int p){    if(vis[i][j][p])return;    vis[i][j][p]=1;    if(map[i][j]){        if(p&1){            ans+=4-pi/2;            vis[i][j][1]=vis[i][j][3]=1;        }else ans+=pi/4;        if(p&1){            if(i>1)dfs(i-1,j,4);            if(j>1)dfs(i,j-1,2);            if(i!=n)dfs(i+1,j,2);            if(j!=m)dfs(i,j+1,4);        }else if(p==2){            if(i>1)dfs(i-1,j,3);            if(j!=m)dfs(i,j+1,1);        }else{            if(i!=n)dfs(i+1,j,1);            if(j>1)dfs(i,j-1,3);        }    }else{        if(!(p&1)){            ans+=4-pi/2;            vis[i][j][2]=vis[i][j][4]=1;        }else ans+=pi/4;        if(!(p&1)){            if(i>1)dfs(i-1,j,3);            if(j>1)dfs(i,j-1,3);            if(i!=n)dfs(i+1,j,1);            if(j!=m)dfs(i,j+1,1);        }else if(p==1){            if(i>1)dfs(i-1,j,4);            if(j>1)dfs(i,j-1,2);        }else{            if(i!=n)dfs(i+1,j,2);            if(j!=m)dfs(i,j+1,4);        }    }}int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d%d\n",&n,&m);    fo(i,1,n)        fo(j,1,m){            char ch=getchar();            for(;(ch!='0')&&(ch!='1');ch=getchar());            map[i][j]=ch-'0';        }    scanf("%d",&q);    fo(i,1,q){        int x,y;scanf("%d%d",&x,&y);        if(x%2+y%2==1)printf("0.0000\n");        else{            ans=0;            fo(i,1,n)fo(j,1,m)fo(k,1,4)vis[i][j][k]=0;            if((!x)&&(!y))dfs(1,1,1);            else if((!x)||(!y)){                if(!y)dfs(x/2,1,4);                else dfs(1,y/2,2);            }else if(x%2==0){                dfs(x/2,y/2,3);            }else{                if(map[(x+1)/2][(y+1)/2])dfs((x+1)/2,(y+1)/2,1);                else dfs((x+1)/2,(y+1)/2,2);            }            printf("%.4lf\n",ans);        }    }    return 0;}
0 0