小小明系列故事——遊戲的煩惱
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 816 Accepted Submission(s): 289
1. x*y大小的小矩陣內必須有x*y個黑點。
2. 多個小矩陣可以重疊,但是每個小矩陣放置的位置必須是獨一無二的,即不同的小矩陣內的黑點不能完全相同。例如1*2的矩陣可以橫着放,也可以豎着放,這兩種方法是不同的,即使它們可能共用黑點。
小小明是個粗心的孩子,他嘗試了很多遍都無法將所有的符合要求的小矩陣找到,聰明的你,能不能告訴煩惱中的小小明這個大矩陣裏有多少個滿足要求的小矩陣呢?
每組測試數據的第一行包含2個正整數n和m,然後第二行是x和y(n,m,x,y的意思如題),接下來n行,每行m個字符,其中’ * ’表示黑點,’ . ’表示空白。
n和m爲0則結束輸入。
[Technical Specification]
0 < n, m <= 2000
0 < x, y <= 1000
#include<stdio.h>
#include<string.h>
int map[2005][2005],l[2005],l2[2005],h[2005];
int main()
{
int n,m,i,j,ans,x,y;
char c;
while(scanf("%d %d",&n,&m)&&n!=0)
{
ans=0;
scanf("%d %d",&x,&y);
getchar();
memset(h,0,sizeof h);
memset(l,0,sizeof l);
memset(l2,0,sizeof l2);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&c);
if(c=='*')
map[i][j]=1;
else
map[i][j]=0;
}
getchar();
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(map[i][j]==1)
{
h[j]++;
if(h[j]>=x)
l[j]=l[j-1]+1;
else
l[j]=0;
if(h[j]>=y)
l2[j]=l2[j-1]+1;
if(h[j]>=x&&l[j]>=y)
ans++;
if(h[j]>=y&&l2[j]>=x&&x!=y)
ans++;
}
else
h[j]=l[j]=l2[j]=0;
}
printf("%d\n",ans);
}
return 0;
}