Problem
Description
Input
Output
Sample Input
1 2
01
4
0 0
2 0
0 1
0 2
Sample Output
0.7854
4.8584
0.0000
4.8584
Data Constraint
Solution
个人在比赛的时候手贱,将代码中的两个5写成了3,60分。
首先我们将2种正方形分成6中图案。
然后我们发现,一个大正方形中的9个点,正上正下正左正右四个点墨水滴下来面积为0.
其他的按照情况自己确定墨水滴在哪个区域,然后6个区域各自会扩散到哪几个区域。
本人一共打了6000多B,不过可以简化。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define N 110
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
char c[N][N];
int a[N][N];
bool b[N][N][6];
int i,j,n,m,q,x,y;
double pi,ans;
void dg(int x,int y,int z)
{
if (z==1)
{
ans=ans+4-(double)pi/2;
b[x][y][z]=1;
if (x+1<=n-1 && y-1>=0)
{
if (c[x+1][y-1]=='0' && !b[x+1][y-1][1]) dg(x+1,y-1,1);else
if (c[x+1][y-1]=='1' && !b[x+1][y-1][6]) dg(x+1,y-1,6);
}
if (x+1>=0)
{
if (c[x+1][y]=='0' && !b[x+1][y][2]) dg(x+1,y,2);else
if (c[x+1][y]=='1' && !b[x+1][y][5]) dg(x+1,y,5);
}
if (y-1>=0)
{
if (c[x][y-1]=='0' && !b[x][y-1][3]) dg(x,y-1,3);else
if (c[x][y-1]=='1' && !b[x][y-1][5]) dg(x,y-1,5);
}
if (x-1>=0 && y+1<=m-1)
{
if (c[x-1][y+1]=='0' && !b[x-1][y+1][1]) dg(x-1,y+1,1);else
if (c[x-1][y+1]=='1' && !b[x-1][y+1][4]) dg(x-1,y+1,4);
}
if (x-1>=0)
{
if (c[x-1][y]=='0' && !b[x-1][y][3]) dg(x-1,y,3);else
if (c[x-1][y]=='1' && !b[x-1][y][5]) dg(x-1,y,5);
}
if (y+1<=m-1)
{
if (c[x][y+1]=='0' && !b[x][y+1][2]) dg(x,y+1,2);else
if (c[x][y+1]=='1' && !b[x][y+1][5]) dg(x,y+1,5);
}
} else
if (z==2)
{
ans=ans+(double)pi/4;
b[x][y][z]=1;
if (x-1>=0 && y-1>=0)
{
if (c[x-1][y-1]=='0' && !b[x-1][y-1][3]) dg(x-1,y-1,3);else
if (c[x-1][y-1]=='1' && !b[x-1][y-1][5]) dg(x-1,y-1,5);
}
if (x-1>=0)
{
if (c[x-1][y]=='0' && !b[x-1][y][1]) dg(x-1,y,1);else
if (c[x-1][y]=='1' && !b[x-1][y][4]) dg(x-1,y,4);
}
if (y-1>=0)
{
if (c[x][y-1]=='0' && !b[x][y-1][1]) dg(x,y-1,1);else
if (c[x][y-1]=='1' && !b[x][y-1][6]) dg(x,y-1,6);
}
} else
if (z==3)
{
ans=ans+(double)pi/4;
b[x][y][z]=1;
if (x+1<=n-1 && y+1<=m-1)
{
if (c[x+1][y+1]=='0' && !b[x+1][y+1][2]) dg(x+1,y+1,2);else
if (c[x+1][y+1]=='1' && !b[x+1][y+1][5]) dg(x+1,y+1,5);
}
if (x+1<=n-1)
{
if (c[x+1][y]=='0' && !b[x+1][y][1]) dg(x+1,y,1);else
if (c[x+1][y]=='1' && !b[x+1][y][6]) dg(x+1,y,6);
}
if (y+1<=m-1)
{
if (c[x][y+1]=='0' && !b[x][y+1][1]) dg(x,y+1,1);else
if (c[x][y+1]=='1' && !b[x][y+1][4]) dg(x,y+1,4);
}
} else
if (z==4)
{
ans=ans+(double)pi/4;
b[x][y][z]=1;
if (x+1<=n-1 && y-1>=0)
{
if (c[x+1][y-1]=='0' && !b[x+1][y-1][1]) dg(x+1,y-1,1);else
if (c[x+1][y-1]=='1' && !b[x+1][y-1][6]) dg(x+1,y-1,6);
}
if (x+1>=0)
{
if (c[x+1][y]=='0' && !b[x+1][y][2]) dg(x+1,y,2);else
if (c[x+1][y]=='1' && !b[x+1][y][5]) dg(x+1,y,5);
}
if (y-1>=0)
{
if (c[x][y-1]=='0' && !b[x][y-1][3]) dg(x,y-1,3);else
if (c[x][y-1]=='1' && !b[x][y-1][5]) dg(x,y-1,5);
}
} else
if (z==5)
{
ans=ans+4-(double)pi/2;
b[x][y][z]=1;
if (x-1>=0 && y-1>=0)
{
if (c[x-1][y-1]=='0' && !b[x-1][y-1][3]) dg(x-1,y-1,3);else
if (c[x-1][y-1]=='1' && !b[x-1][y-1][5]) dg(x-1,y-1,5);
}
if (x-1>=0)
{
if (c[x-1][y]=='0' && !b[x-1][y][1]) dg(x-1,y,1);else
if (c[x-1][y]=='1' && !b[x-1][y][4]) dg(x-1,y,4);
}
if (y-1>=0)
{
if (c[x][y-1]=='0' && !b[x][y-1][1]) dg(x,y-1,1);else
if (c[x][y-1]=='1' && !b[x][y-1][6]) dg(x,y-1,6);
}
if (x+1<=n-1 && y+1<=m-1)
{
if (c[x+1][y+1]=='0' && !b[x+1][y+1][2]) dg(x+1,y+1,2);else
if (c[x+1][y+1]=='1' && !b[x+1][y+1][5]) dg(x+1,y+1,5);
}
if (x+1<=n-1)
{
if (c[x+1][y]=='0' && !b[x+1][y][1]) dg(x+1,y,1);else
if (c[x+1][y]=='1' && !b[x+1][y][6]) dg(x+1,y,6);
}
if (y+1<=m-1)
{
if (c[x][y+1]=='0' && !b[x][y+1][1]) dg(x,y+1,1);else
if (c[x][y+1]=='1' && !b[x][y+1][4]) dg(x,y+1,4);
}
} else
if (z==6)
{
ans=ans+(double)pi/4;
b[x][y][z]=1;
if (x-1>=0 && y+1<=m-1)
{
if (c[x-1][y+1]=='0' && !b[x-1][y+1][1]) dg(x-1,y+1,1);else
if (c[x-1][y+1]=='1' && !b[x-1][y+1][4]) dg(x-1,y+1,4);
}
if (x-1>=0)
{
if (c[x-1][y]=='0' && !b[x-1][y][3]) dg(x-1,y,3);else
if (c[x-1][y]=='1' && !b[x-1][y][5]) dg(x-1,y,5);
}
if (y+1<=m-1)
{
if (c[x][y+1]=='0' && !b[x][y+1][2]) dg(x,y+1,2);else
if (c[x][y+1]=='1' && !b[x][y+1][5]) dg(x,y+1,5);
}
}
}
int main()
{
freopen("flooding.in","r",stdin);
freopen("flooding.out","w",stdout);
scanf("%d%d\n",&n,&m);
fo(i,0,n-1)
{
fo(j,0,m-1) scanf("%c",&c[i][j]);
scanf("\n");
}
pi=3.1415926535;
scanf("%d",&q);
while (q--)
{
memset(b,0,sizeof(b));
scanf("%d%d",&x,&y);
if ((x+y)%2==1)
{
printf("0.0000\n");
continue;
}
ans=0;
if (x%2 && y%2)
{
if (c[x/2][y/2]=='0') dg(x/2,y/2,1); else dg(x/2,y/2,5);
} else
{
if (!x && !y)
{
if (c[0][0]=='0') dg(0,0,2);else dg(0,0,5);
} else
if (!x && y)
{
if (c[0][y/2-1]=='0') dg(0,y/2-1,1);else dg(0,y/2-1,6);
} else
if (x && !y)
{
if (c[x/2-1][0]=='0') dg(x/2-1,0,1);else dg(x/2-1,0,4);
} else
if (x<2*n && y==2*m)
{
if (c[x/2-1][m-1]=='0') dg(x/2-1,m-1,3);else dg(x/2-1,m-1,5);
} else
if (x==2*n && y<2*m)
{
if (c[n-1][y/2-1]=='0') dg(n-1,y/2-1,3);else dg(n-1,y/2-1,5);
} else
if (x==2*n && y==2*m)
{
if (c[n-1][m-1]=='0') dg(n-1,m-1,3);else dg(n-1,m-1,5);
}
if (x>0 && x<2*n && y>0 && y<2*m)
{
if (c[x/2-1][y/2-1]=='0') dg(x/2-1,y/2-1,3);else dg(x/2-1,y/2-1,5);
}
}
printf("%.4lf\n",ans);
}
}