HDU 4517
EASY题,直接统计(1,1)到(i,j)的黑点个数,然后计算出以(i,j)点为右下角的矩形内的黑点个数是x*y即可。
注意当x==y时不要重复统计。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int N=2005; int cn[N][N]; int n,m,x,y; char str[N]; int main(){ while(scanf("%d%d",&n,&m),n||m){ scanf("%d%d",&x,&y); for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++) cn[i][j]=0; } int ans=0; for(int i=1;i<=n;i++){ scanf("%s",str+1); for(int j=1;j<=m;j++) if(str[j]=='*'){ cn[i][j]=cn[i-1][j]+cn[i][j-1]-cn[i-1][j-1]+1; if(i-x>=0&&j-y>=0){ ans+=(cn[i][j]-cn[i-x][j]-cn[i][j-y]+cn[i-x][j-y])==x*y?1:0; } if(i-y>=0&&j-x>=0&&x!=y){ ans+=(cn[i][j]-cn[i-y][j]-cn[i][j-x]+cn[i-y][j-x])==x*y?1:0; } } else cn[i][j]=cn[i-1][j]+cn[i][j-1]-cn[i-1][j-1]; } printf("%d\n",ans); } return 0; }